当前位置: 首页 > 知识库问答 >
问题:

JPA托管实体与JavaFX属性

江敏学
2023-03-14

我目前的项目是用JavaFX完成的。我使用属性将(双向)视图字段绑定到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;
}

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

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

再次感谢

共有1个答案

羊舌旭尧
2023-03-14

除上述解决方案外,标准解决方案为:

    < li >在模型中使用分离的对象,然后将它们合并到EntityManager中。 < li >在模型中使用托管对象,保持EntityManager打开(没有分离/合并)。
 类似资料:
  • 我有一个java代码,我正在更新staff实体。我正在使用应用程序管理的实体管理器。我在登录页面中有一个条件,如果用户提供了正确的用户名/密码,他的上次登录时间将被更新。 但是更新没有发生,我得到一个实体已被分离的异常。请参阅下面的代码:- staffDAOImpl.java:- 在StaffServiceImpl.java类中,您将看到我通过调用“StaffDAO.findUnique(logi

  • 我正在使用JavaFX属性的模型实体consitiing witch允许我更改单个位置上的值,将它们绑定到UI,并在模型实体数组中添加带有额外条件的更改的监听器(惟一值等)。 我必须将模型存储在数据库中,所以问题如下: 注意:一些可绑定属性根本不必持久化。

  • 问题内容: 下面给出从到的一对多关系。 部门(家长): 员工(孩子): 合并如下所示的托管实体(子实体)(在EJB中使用CMT), 不会更新数据库表中的相应员工行。仅当从中的子关系中删除时,才会发生这种情况。 为什么表中的行没有更新?关于此示例的唯一目的是什么? 我当前正在使用具有JPA 2.1的EclipseLink 2.6.0。 问题答案: 级联应该始终从父级传播到子级,而不是相反。 在您的情

  • 例如,假设我们有三个实体:、和。一条消息可以有多个标签,但只能有一个作者。 所以消息基本上是: 链接是单向的。 显然,Spring管理的实体与常规EntityManager操作的实体有点不同。但是有什么明确的文档吗?文件帮助不大。

  • 基地 我有一个由JPA(EclipseLink)管理的mysql DB(实体和控制器+持久化单元)。GUI是基于JavaFX的。 信息 null null 我想这不是最好的解决办法。 问题没有混合模式!我认为在服务器端使用javafx属性是疯狂的,即使是超级懒惰的实现。 有一个灵活的解决方案,可以拥有JavaFX Bean的所有优点,例如双向绑定,并保持JPA实体代码不变? 所以...我正在使用一

  • 在我的实际应用程序中,我有一个业务层,它根据一些业务规则使用JPA来持久化数据,问题是camel JPA事务没有与业务层事务共享。我需要业务类中的EntityManager与Camel事务范围集成,我该怎么做? 下面是一个简单的例子,但这反映了实际设计中的问题。 项目实例 服务级别 骆驼路线 骆驼背景。xml