JPA OneToMany仅在第一次更新



我正在使用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 模型。有关示例,请参阅此博客文章。

最新更新