我正在使用EclipseLink,我有两个基本的类,比如
@Entity
public class Foo {
@Id
@Column(name="FOO_ID)
private int id;
@Column(name="FOO_NAME")
private String name;
@OneToMany(mappedBy = "foo")
private List<Bar> bars;
}
@Entity
public class Bar {
@Id
@Column(name="BAR_ID")
private it id;
@Column(name="BAR_NAME")
private String name;
@ManyToOne
@JoinColumn(name="FOO_ID")
private Foo foo;
}
然后我有一些代码基本上可以
public void processBar(Foo foo) {
Bar bar = new Bar();
bar.setName("Test");
bar.setFoo(foo);
entityMgr.persist(bar);
List<Bar> bars = foo.getBars();
for (Bar b : bars) {
System.out.println("Bar - id : " + b.getId());
System.out.println("Bar - name : " + b.getName());
}
}
当我进入 web 应用程序并调用代码(foo 设置得很好)时,我可以看到一个子Bar
的预期输出,其中包含我期望的 id 和名称。
如果我随后进入新会话并运行相同的代码,那么我仍然看到第一个(并且只有第一个),而不是看到两个Bar
,但Bar
记录是在数据库中创建的并且正确链接。
如果我在创建新Bar
之前添加相同的循环来打印出条形,那么在创建bar
之前和之后,我总是看到一个空列表
在oneToMany
上设置fetch = FetchType.EAGER)
给了我空集。 添加 bar 后合并 foo 没有任何区别。
我需要什么才能使其保持一致?
更新
我现在确实通过在Foo
中实现addBar
方法来工作
public void addBar(Bar b) {
bars.add(b);
}
向关系添加级联
@OneToMany(mappedBy="foo", cascade = CascadeType.ALL)
然后我用foo.addBar(bar)
替换了酒吧的persist
最后加了entityMgr.merge(foo)
现在它正在按我的预期工作,但我仍然不明白为什么原始代码不起作用,所以这个问题仍然存在于该代码如何工作(或者是否必须像我在这里所做的那样完成)
您使用的是双向 OneToMany 关系,因此,如果您在关系中添加或删除项目,例如通过提供特殊的资源库,您有责任更新 Java 模型。有关示例,请参阅此博客文章。