2012-12-23 57 views
1

我目前的项目是使用JavaFX完成的。我使用属性来绑定(双向)视图字段到bean(使用JFXtras的BeanPathAdapter)。JPA管理实体与JavaFX属性

我选择使用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字段相同。

你能帮我找到解决办法吗?

感谢,

大烟

编辑: 我回答我自己的问题:对

3小时的研究后,我发现了一个解决方案。

'克隆'解决方案是我引用的每个'最好',但我不认为它是最好的。

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

我没有一个通用的方法没有失败再次

因此,解决办法:当我有向实体绑定到视图,我用entity.clone()所以我可以使用实体作为非托管,并在需要时合并。

但是,如果你有一个妥善的解决办法,我很感兴趣:)

再次感谢

回答

2

除了上述方案中,标准的解决方案是:在

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