JPA管理实体与JavaFX属性

时间:2012-12-23 11:02:16

标签: java jpa javafx objectdb

我当前的项目是使用JavaFX完成的。我使用属性将(bidirectionnal)视图字段绑定到bean(使用JFXtras的BeanPathAdapter)。

我选择将JPA与ObjectDB一起用作模型。

这是我第一次在独立项目中使用JPA,在这里我遇到了托管实体的问题。

实际上,我将托管实体绑定到视图字段,当视图字段的值发生更改时,实体会更新......还会更新数据库。

我正在尝试找到一种手动持久化/合并实体的方法,以便我可以询问用户是否要保存。

这是我用来获取列表的代码:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("$objectdb/data/db.odb");
EntityManager em = emf.createEntityManager();

List<XXX> entities = em.createQuery("SELECT x FROM XXX x").getResultList();

所以当我做的时候

entity.setName("test");

实体在数据库中更新。

我正在寻找的是实体不会自动更新。

我试过(就在getResultList之后)

em.clear();

em.detach(entity);

但即使使用CascadeType.DETACH,它也会丢失关系实例。

我也试过

em.setFlushMode(FlushModeType.COMMIT);

但它仍会自动更新......

我也尝试克隆该对象。但是当我想合并它时,它给了我一个例外:

Attempt to reuse an existing primary key value

我想了另一种解决方案:将变量用作'缓冲区',并在用户保存时用缓冲区填充托管bean。但BeanPathAdapter失去了意义。它与手动填充视图字段和保存后手动填充bean字段相同。

你能帮我找一个解决方案吗?

谢谢,

发烟

修改 我回答我自己的问题:p

经过3个小时的研究,我找到了解决方案。

“克隆”解决方案是我引用的每个人中“最好的”,但我不认为这是最好的。

异常的原因是我用来持久化/合并我的实体的代码。我坚持使用已经存在的id来管理未经管理的实体。我以为我在合并......

我做了一个不再失败的通用方法

public <T extends IEntity> T persist(T object) {
    em.getTransaction().begin();

    if (object.getId() == null) {
        em.persist(object);
        em.flush();

        em.getTransaction().commit();

        em.refresh(object);
    }
    else {
        object = em.merge(object);

        em.getTransaction().commit();
    }

    return object;
}

所以解决方案:当我必须将实体绑定到视图时,我使用entity.clone(),因此我可以将实体用作非托管并在需要时进行合并。

但如果你有一个合适的解决方案,我很感兴趣:)

再次感谢

1 个答案:

答案 0 :(得分:2)

除上述解决方案外,标准解决方案还包括:

  • 在模型中使用分离的对象,然后将它们合并到EntityManager中。
  • 在模型中使用托管对象,保持EntityManager打开(没有分离/合并)。