Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠';s的双向一对一关系不在同一类中工作_Java_Hibernate_Jpa_Hibernate Mapping - Fatal编程技术网

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;