Java 冬眠';s的双向一对一关系不在同一类中工作
我正在尝试使用同一类的一对一休眠关系创建“命令链”:Java 冬眠';s的双向一对一关系不在同一类中工作,java,hibernate,jpa,hibernate-mapping,Java,Hibernate,Jpa,Hibernate Mapping,我正在尝试使用同一类的一对一休眠关系创建“命令链”: @Entity public class Command { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", unique = true) private Long id; @ElementCollection @LazyCollection(LazyCollectionOption.FALSE) private List<Str
@Entity
public class Command {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true)
private Long id;
@ElementCollection
@LazyCollection(LazyCollectionOption.FALSE)
private List<String> commandWithArguments = new ArrayList<String>();
private ExecutionStatus status = ExecutionStatus.NOT_EXECUTED;
@OneToOne(mappedBy = "parentCommand", cascade = CascadeType.ALL)
private Command child;
@OneToOne(mappedBy = "child", cascade = CascadeType.ALL)
private Command parentCommand;
@OneToOne(mappedBy = "command")
private ExecutionResult result;
public Command() {
}
....
然而,正如您所看到的,parentCommand属性并没有丢失
我使用的是hibernate 4.3.8如果是父项还是子项,您需要指定在双向关系(拥有方)中谁将携带外键 子项将包含parrent的引用(FK)
@OneToOne(cascade = CascadeType.ALL)
private Command child;
@OneToOne(mappedBy = "child", cascade = CascadeType.ALL)
private Command parentCommand;
父项将包含子项的引用(FK)
我认为您的问题在于,您正在为同一个映射定义两个
mappedBy
属性,因此Hibernate将在映射中混淆
所以不需要使用这两个选项,您有两个选择:
1。在类中仅使用一个命令
对象,并将其映射到OneToOne
,如下所示:
@OneToOne(cascade = CascadeType.ALL)
private Command parentCommand;
2.或要使其双向,请像您那样在类中使用两个命令
对象,并使用OneToOne
映射其中两个对象,但是仅使用mappedBy
与child一起引用父命令
:
@OneToOne(mappedBy = "parentCommand", cascade = CascadeType.ALL)
private Command child;
@OneToOne(cascade = CascadeType.ALL)
private Command parentCommand;
这与我的答案有什么不同?它太不一样了,首先提出了问题,然后展示了两种解决方法和映射
OneToOne
关系的方法,其中只有第二种方法与你的类似。我对两种答案都投了赞成票,但接受了@chsdk的答案,因为它更为详细。非常感谢你们两位!太好了,很高兴能帮上忙。
@OneToOne(cascade = CascadeType.ALL)
private Command parentCommand;
@OneToOne(mappedBy = "parentCommand", cascade = CascadeType.ALL)
private Command child;
@OneToOne(cascade = CascadeType.ALL)
private Command parentCommand;