jpa、jsf以及我的实体是否仍应被管理?

beq87vna  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(305)

我有一组父/子数据库表,我想做的是
在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的所有信息都表明,你应该对它保持警惕,但它在某些情况下是有用的,但似乎没有任何东西详细说明这些情况是什么。。。
所以我想基本的问题仍然存在,我的对象应该被管理吗?原始方法有什么问题吗?断开对象的连接并在更新后合并它们(唯一的影响是额外的数据库查询以在合并时获取当前记录?)

vsmadaxz

vsmadaxz1#

我认为问题在于,jpa管理示例,当您的实体向下移动到jsf层并返回时,它们被转换成不同的示例,而这些示例不是由jpa管理的。。。

相关问题