我目前的项目是使用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()所以我可以使用实体作为非托管,并在需要时合并。
但是,如果你有一个妥善的解决办法,我很感兴趣:)
再次感谢