Hibernate 的双向 OneToOne 关系在同一个 class 中不起作用

Hibernate's bidirectional OneToOne relationship not working within the same class

我正在尝试使用具有相同 class:

的一对一休眠关系来创建 "a chain of commands"
@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() {
}
....

hibernate 支持这样的关系吗?它在初始化期间抛出以下异常:

 Initial SessionFactory creation failed.org.hibernate.AnnotationException: Unknown mappedBy in: com.dockerhosting.domain.system.Command.child, referenced property unknown: com.dockerhosting.domain.system.Command.parentCommand

然而如您所见,parentCommand 属性 并没有丢失。

我正在使用休眠 4.3.8

如果parent或child

,您需要指定谁将在您的双向关系(拥有方)中携带外键

child 将包含父母的参考资料(FK)

@OneToOne(cascade = CascadeType.ALL)
private Command child;

@OneToOne(mappedBy = "child", cascade = CascadeType.ALL)
private Command parentCommand;

Parent 将包含 child

的引用(FK)
@OneToOne(mappedBy = "parentCommand", cascade = CascadeType.ALL)
private Command child;

@OneToOne(cascade = CascadeType.ALL)
private Command parentCommand;

我认为你的问题是你为同一个映射定义了两个 mappedBy 属性,所以 Hibernate 会在映射中混淆。

所以没有必要同时使用这两个,这里有两个选择:

1. 在你的 class 中只使用一个 Command object 并像这样用 OneToOne 映射它:

@OneToOne(cascade = CascadeType.ALL)
private Command parentCommand;

2. 或者让它双向使用两个 Command objects 在你的 class 就像你做的那样并映射两个他们使用 OneToOne 使用 mappedBy 仅使用 child 来引用 parentCommand:

@OneToOne(mappedBy = "parentCommand", cascade = CascadeType.ALL)
private Command child;

@OneToOne(cascade = CascadeType.ALL)
private Command parentCommand;