[英]JPA, JSF and should my entity still be managed?
我有一組父/子數據庫表,我想要發生的是
我有這個工作,但在這一點上,我來保留我正在合並的數據,因為對象沒有被管理。 我不確定這是否是因為我缺少一些基本的東西並且不應該管理對象,或者我是否在代碼中做錯了什么。
@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);
}
}
<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 代碼中表示它不受管理。
這是使用合並工作,但我擔心我錯過了一些基本的東西,我只是通過調用合並來隱藏真正的問題。
好吧,這似乎是我缺乏理解。 我沒有意識到持久性緩存的持續時間與事務一樣長,因此一旦返回對象的代碼完成,對象就會斷開連接。
將 DAOService 更改為@Stateful
並將PersistenceContextType
更改為擴展確實意味着在我處理更新時對象仍在緩存中。 我能找到的關於 EXTENDED 的所有內容都表明你應該警惕它,但它在某些情況下很有用,但似乎沒有詳細說明這些情況是什么......
所以我想基本問題仍然存在,我的對象應該被管理嗎? 原始方法有什么問題嗎?斷開對象並在更新后合並它們(唯一的影響是額外的數據庫查詢以在合並時獲取當前記錄?)
我認為問題是,JPA 管理實例,當您的實體向下移動到 JSF 層並返回時,它們被轉換為不同的實例,這些實例不受 JPA 管理......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.