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;
我正在尝试使用具有相同 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;