我有一组父/子数据库表,我想做的是
在datatable中向用户显示父对象列表
用户单击行上的按钮为该行创建子记录
我有这个工作,但在这一点上,我来持久化我合并的数据,因为对象是不受管理的。我不确定这是否是因为我缺少一些基本的东西,对象不应该被管理,或者我是否在代码中做了一些错误的事情。
波乔
@Entity
public class Foo {
@Id
@Column(name="FOO_ID)
private int id;
@Column(name="FOO_NAME")
private String name;
@OneToMany(mappedBy="foo", cascade = CascadeType.ALL)
private List<Bar> bars;
private void addBar(Bar bar) {
bars.add(bar);
bar.setFoo(this);
}
}
@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;
}
道务
@RequestScoped
@Transactional(value = Transactional.TxType.REQUIRED)
public class DAOService {
@PersistenceContext(unitName = "jpa-pu")
private EntityManager entityMgr;
public List<Foo> getFoos() {
TypedQuery<Foo> fooQuery = entityMgr.createQuery("select f from Foo ...", Foo.class);
return fooQuery.setParameter("param", "value").getResultList();
}
public void processFoo(Foo foo) {
Bar bar = new Bar();
bar.setName("Test");
foo.addBar(bar);
entityMgr.merge(foo); // Don't think this should be merge
}
// more stuff
}
背豆
@Named
@ViewScoped
public class MyBean implements Serializable {
@Inject
private DAOService dao;
private List<Foo> foos;
private Foo selectedFoo;
@PostConstruct
private void init() {
foos = dao.getFoos();
}
public void processFoo() {
dao.processFoo(selectedFoo);
}
}
jsf
<h:form>
<p:dataTable id="dt" value="#{myBean.bars}" var="bar">
<p:column headerText="id">
<h:outputText value="#{foo.id}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{foo.name}" />
</p:column>
<p:column>
<p:commandButton value="here" action="#{myBean.processFoo}" update=":form:dt">
<f:setPropertyActionListener value="#{foo}" target="#{myBean.selectedFoo}" />
</p:commandButton>
</p:column>
</p:dataTable>
</h:form>
问题
我的理解是,我不应该真的需要合并 foo
返回源于entitymgr查询,但添加了对 entityMgr.contains(foo)
进入daoservice代码表示它未被管理。
这是工作使用合并,但我担心我错过了一些基本的东西,我只是隐藏了真正的问题调用合并。
更新
好吧,这似乎是我缺乏理解。我没有意识到持久性缓存只会持续一个事务,因此,一旦返回对象的代码完成,对象就会断开连接。
将DAOS服务更改为 @Stateful
以及改变 PersistenceContextType
扩展并不意味着在我处理更新时对象仍在缓存中。我能找到的关于extended的所有信息都表明,你应该对它保持警惕,但它在某些情况下是有用的,但似乎没有任何东西详细说明这些情况是什么。。。
所以我想基本的问题仍然存在,我的对象应该被管理吗?原始方法有什么问题吗?断开对象的连接并在更新后合并它们(唯一的影响是额外的数据库查询以在合并时获取当前记录?)
1条答案
按热度按时间vsmadaxz1#
我认为问题在于,jpa管理示例,当您的实体向下移动到jsf层并返回时,它们被转换成不同的示例,而这些示例不是由jpa管理的。。。