我有一个老的基于ant的项目,它使用spring和hibernate(我们手动添加依赖jar来构建路径)。
作为更改的一部分,我们必须升级hibernate版本(从3到4)(还添加了一些新jar)在这个版本升级之后,我们面临的问题很少是由于Map引起的。
在少数实体类中,我们对同一字段有两个注解:
@OneToMany(mappedBy="xxxx", cascade = PERSIST, fetch=FetchType.EAGER)
@JoinColumn(name="xxx", referencedColumnName="xxxxx")
但是在版本升级之后,我们不能同时使用mappedby和joincolumn。在某些情况下,我们尝试删除mappedby,在某些情况下,我们尝试删除joincolumn。它在某些情况下有效,但在整个应用程序中不起作用。有什么方法可以在hibernate4中保留这个Map/关系吗。
这是在多个功能上造成麻烦的主要问题。
1条答案
按热度按时间ef1yzkbh1#
如jpa规范所述(见第2.9节实体关系):
以下规则适用于双向关系:
双向关系的反向端必须使用
mappedBy
元素OneToOne
,OneToMany
,或ManyToMany
注解。这个mappedBy
元素指定实体中作为关系所有者的属性或字段。一对多/多对一双向关系的多方必须是拥有方,因此
mappedBy
无法在上指定元素ManyToOne
注解。对于一对一的双向关系,拥有方对应于包含相应外键的一方。
对于多对多双向关系,任何一方都可能是拥有方。
这个
@JoinColumn
注解可用于单向或双向的所有者侧OneToOne
,ManyToOne
与单向的联系OneToMany
.双向的
@OneToMany
```@Entity
@Table(name = "TBL_PARENT")
class Parent {
// We should not use @JoinColumn here, it should be used
// on the the owning side of this association
@OneToMany(mappedBy = "parent")
List children;
}
@Entity
@Table(name = "TBL_CHILD")
class Child {
@ManyToOne
@JoinColumn(name = "CH_PARENT_ID")
Parent parent;
}
@Entity
@Table(name = "TBL_PARENT")
class Parent {
// We should not use mappedBy element of the @OneToMany annotation here.
// The name element of the @JoinColumn is referred to the
// TBL_CHILD.CH_PARENT_ID column
@OneToMany
@JoinColumn(name = "CH_PARENT_ID")
List children;
}
@Entity
@Table(name = "TBL_CHILD")
class Child {
// This part is absent as this is unidirectional OneToMany.
// @ManyToOne
// @JoinColumn(name = "CH_PARENT_ID")
// Parent parent;
}