我有两个具有 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,只制作一组?我以为这已经可以工作了
首先你需要很好地理解其中的关系。正如我在这里看到的,您可能会尝试在 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
的映射。做相反的事情是没有意义的。不是吗?
你错过了关系的另一面。
如果您说
bar.setFoo(foo)
,那么您必须说foo.setBar(bar)
,或者当然您也可以在setFoo
方法中执行此操作。
级联意味着它将触发关系上的操作,但是在您的情况下,由于一侧丢失,关系未完成。