java - JPA 托管实体与 JavaFX 属性

标签 java jpa javafx objectdb

我当前的项目是使用JavaFX完成的。我使用属性将(双向) View 字段绑定(bind)到 bean(使用 JFXtras 的 BeanPathAdapter)。

我选择使用 JPA 和 ObjectDB 作为模型。

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

实际上,我将托管实体绑定(bind)到 View 字段,当 View 字段的值发生更改时,实体会更新......数据库也会更新。

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

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

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);

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

我还尝试克隆该对象。但是当我想合并它时,它给了我一个异常(exception):

Attempt to reuse an existing primary key value

我想到了一个替代解决方案:使用变量作为“缓冲区”,并在用户保存时用缓冲区填充托管 bean。但 BeanPathAdapter 失去了意义。与保存后手动填充 View 字段和手动填充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;
}

所以解决方案:当我必须将实体绑定(bind)到 View 时,我使用entity.clone(),这样我就可以将实体用作非托管实体并在需要时合并。

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

再次感谢

最佳答案

除了上述解决方案外,标准解决方案还有:

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

关于java - JPA 托管实体与 JavaFX 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14010426/

相关文章:

java - JPA 中实体的序列生成器

java - 任务调度程序,共享表单标签变量

java - FXML 加载的 javafx main 方法中的错误未得到纠正

java - 在 ArrayList 和 LinkedList 上使用归并排序 : Java

java - 合并两个不重复的对象列表

java - 在 Android Studio 中导入 java.util.stream.Stream 时出错

java - JPA 如何应对可扩展性

spring - 我可以像使用 Spring 一样使用 CDI 和 @PersistenceContext 注入(inject) JPA EntityManager 吗?

java - 使用 javaFX 解压文件时出错

java - Glassfish 项目似乎没有在 Tomcat 服务器上运行