簡體   English   中英

JPA、JSF 以及我的實體是否仍應受管理?

[英]JPA, JSF and should my entity still be managed?

我有一組父/子數據庫表,我想要發生的是

  • 父對象列表在數據表中顯示給用戶
  • 用戶單擊行上的按鈕為該行創建子記錄

我有這個工作,但在這一點上,我來保留我正在合並的數據,因為對象沒有被管理。 我不確定這是否是因為我缺少一些基本的東西並且不應該管理對象,或者我是否在代碼中做錯了什么。

POJO

@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;
}

DAO服務

@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 代碼中表示它不受管理。

這是使用合並工作,但我擔心我錯過了一些基本的東西,我只是通過調用合並來隱藏真正的問題。


更新

好吧,這似乎是我缺乏理解。 我沒有意識到持久性緩存的持續時間與事務一樣長,因此一旦返回對象的代碼完成,對象就會斷開連接。

將 DAOService 更改為@Stateful並將PersistenceContextType更改為擴展確實意味着在我處理更新時對象仍在緩存中。 我能找到的關於 EXTENDED 的所有內容都表明你應該警惕它,但它在某些情況下很有用,但似乎沒有詳細說明這些情況是什么......

所以我想基本問題仍然存在,我的對象應該被管理嗎? 原始方法有什么問題嗎?斷開對象並在更新后合並它們(唯一的影響是額外的數據庫查詢以在合並時獲取當前記錄?)

我認為問題是,JPA 管理實例,當您的實體向下移動到 JSF 層並返回時,它們被轉換為不同的實例,這些實例不受 JPA 管理......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM