通过 Hibernate + JPA 在两个实体中保存 id

问题描述 投票:0回答:2

我有两个具有 OneToOne 关系的实体,如下所示:

@Entity
@Table(name = "FOO")
Foo{
    
    @OneToOne(fetch = FetchType.LAZY, mappedBy = "foo")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    @JoinColumn(name = "BAR_ID")
    private Bar bar;

    // getters and setters
 }

 @Entity
 @Configurable
 @Table(name = "BAR")
 Bar{
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "FOO_ID")
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    private Foo foo;

    // getters and setters
 }

在Service层,我通过在Foo中设置Bar来建立连接:

 Bar.setFoo(foo);
 barDAO.saveOrUpdate(bar);

它将 foo id 保存在 Bar 表中。但相反的情况却不会发生。 hibernate是否可以保存两个id,只制作一组?我以为这已经可以工作了

java hibernate jpa one-to-one
2个回答
1
投票

首先你需要很好地理解其中的关系。正如我在这里看到的,您可能会尝试在 Foo

Bar
之间建立双向
OneToOne
关系。

@Entity
@Table(name = "FOO")
Foo {

     @OneToOne(cascade = CascadeType.ALL)
     @JoinColumn(name = "BAR_ID")
     private Bar bar;

     // getters and setters
}

@Entity
@Table(name = "BAR")
Bar{

    @OneToOne(mappedBy = "bar")
    private Foo foo;

    // getters and setters
}

在双向关联中,关联的两侧退出 – 拥有和逆。对于一对一的双向关系, 拥有方对应于包含适当的方 外键。

此处,拥有方

Foo
,BAR_ID 是该外键。在两端都有连接列是没有意义的。 Relation 将从
Foo
级联到
Bar
。而inverse side就是这里的
Bar
,需要用拥有方引用的
mapped by
值来注释。

现在,如果您在

Bar
中设置
Foo
对象,它将保留
Bar
对象以及与
Foo
的映射。做相反的事情是没有意义的。不是吗?


1
投票

你错过了关系的另一面。

如果您说

bar.setFoo(foo)
,那么您必须说
foo.setBar(bar)
,或者当然您也可以在
setFoo
方法中执行此操作。

级联意味着它将触发关系上的操作,但是在您的情况下,由于一侧丢失,关系未完成。

© www.soinside.com 2019 - 2024. All rights reserved.