【问题标题】:Hibernate's bidirectional OneToOne relationship not working within the same classHibernate 的双向 OneToOne 关系在同一个类中不起作用
【发布时间】:2015-06-08 06:49:53
【问题描述】:

我正在尝试使用同一类的一对一休眠关系创建“命令链”:

@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

【问题讨论】:

    标签: java hibernate jpa hibernate-mapping


    【解决方案1】:

    我认为您的问题是您为同一个映射定义了两个 mappedBy 属性,因此 Hibernate 会在映射中感到困惑。

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

    1. 要在您的类中仅使用一个 Command 对象并将其与 OneToOne 映射,如下所示:

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

    2. 或者让它双向使用你的类中的两个 Command 对象,就像你做的那样,并将它们中的两个映射到 OneToOne 但是使用 @987654327 @只带小孩参考parentCommand

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

    【讨论】:

    • 这与我的回答有何不同?
    • 差别太大了,首先提出问题,然后展示两种解决方法,并映射OneToOne关系,其中只有第二种与你的相似。
    • 我对这两个答案都投了赞成票,但接受了@chsdk 的答案,因为它更详细一些。非常感谢你们!
    • 太好了,很高兴它有帮助。
    【解决方案2】:

    如果父母或孩子,您需要指定谁将在您的双向关系(拥有方)中携带外键

    孩子将包含父母的参考(FK)

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

    父母将包含孩子的参考(FK)

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

    【讨论】:

      猜你喜欢
      • 2021-06-18
      • 2019-04-23
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多