通过 Hibernate + JPA 在两个实体中保存 id
Save id in both entities via Hibernate + JPA
我有两个具有 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);
Wich 将 foo id 保存在 Bar table 中。但相反的情况不会发生。 hibernate 是否可以保存两个 id 只制作一组?我认为这已经可以工作了
你错过了关系的另一面。
如果你说 bar.setFoo(foo)
然后你必须说 foo.setBar(bar)
或者当然你也可以在 setFoo
方法中这样做。
级联意味着它将触发对关系的操作,但是在您的情况下,由于缺少一侧,关系未完成。
你首先要搞清楚关系。正如我在这里看到的那样,您可能会尝试在 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
}
In the bidirectional association two sides of association exits –
owning and inverse. For one to one bidirectional relationships, the
owning side corresponds to the side that contains the appropriate
foreign key.
这里 拥有方 是 Foo
而 BAR_ID 将是那个外键。在两端加入列没有意义。而 Relation 将从 Foo
级联到 Bar
。而这里的反面是Bar
,需要用mapped by
值来注解拥有方引用。
现在,如果您在 Foo
中设置 Bar
对象,它将保留 Bar
对象以及与 Foo
的映射。做相反的事情没有意义。不是吗?
我有两个具有 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);
Wich 将 foo id 保存在 Bar table 中。但相反的情况不会发生。 hibernate 是否可以保存两个 id 只制作一组?我认为这已经可以工作了
你错过了关系的另一面。
如果你说 bar.setFoo(foo)
然后你必须说 foo.setBar(bar)
或者当然你也可以在 setFoo
方法中这样做。
级联意味着它将触发对关系的操作,但是在您的情况下,由于缺少一侧,关系未完成。
你首先要搞清楚关系。正如我在这里看到的那样,您可能会尝试在 Foo
和 Bar
.
@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
}
In the bidirectional association two sides of association exits – owning and inverse. For one to one bidirectional relationships, the owning side corresponds to the side that contains the appropriate foreign key.
这里 拥有方 是 Foo
而 BAR_ID 将是那个外键。在两端加入列没有意义。而 Relation 将从 Foo
级联到 Bar
。而这里的反面是Bar
,需要用mapped by
值来注解拥有方引用。
现在,如果您在 Foo
中设置 Bar
对象,它将保留 Bar
对象以及与 Foo
的映射。做相反的事情没有意义。不是吗?