我正在尝试更改持久对象的ID。我在Hibernate和MySQL中使用JPA。我执行代码时遇到的错误是:org.hibernate.HibernateException:com.tutorial.jpa.certification.listing5_18.AA实例的标识符从2更改为99
我找不到此问题的答案,因此在此感谢您的帮助。代码为:
EntityManagerFactory emf=Persistence.createEntityManagerFactory("Tutorial");
EntityManager em=emf.createEntityManager();
AA aa=em.find(AA.class, 2);
em.getTransaction().begin();
aa.setId(99);
em.merge(aa);
em.getTransaction().commit();
您永远不要修改实体的主键 -这定义了对象的标识,并且更改对象没有任何意义。
如果确实需要-最好删除该实体,然后创建一个新实体,该实体只是复制旧实体,但使用新的主键。这样,如果您有任何约束(例如指向旧标识符的外键),您就会知道的。
也可以在此处查看“身份和排序”部分。
希望这可以帮助。
事务中的持久实例(就是通过 session 装载、保存、创建或者查询出的对象) 被应用程序操作所造成的任何修改都会在 Session 被刷出(flushed)的时候被持久化(本章后面会详细讨论)。这里不需要调用某个特定的方法(比如 update(),设计它的目的是不同的)将你的修改持久化。所以最直接的更新一个对象的方法就是在 Session 处于打开状态时 load() 它,然后直接修改即可: D
问题内容: 有没有一种方法来保存更改,例如更改跨越多个标签的HTML文本的背景,以便在再次加载时将所做的更改反映在HTML页面中。 编辑:详细说明。 加载HTML页面后,将使用range对象和executeCommand选择并突出显示文本: 更改(将文本突出显示为黄色)将一直保留,直到重新加载页面为止。但是,当重新加载页面时,这些更改不存在。我想要以某种方式保存这些更改(例如在本地DB sqlit
问题内容: 我有使用获取的持久性hibernate对象 从那以后我改变了它。 我想执行以节省内存,因为我已经完成了该对象。 此处的文档指出,该对象的更改将不会保留。换句话说- 逐出会使我丢失对对象所做的更改。 我可以打电话,但是那会清空所有更改。 在逐出之前,如何保持对单个持久对象所做的更改? 问题答案: 呼叫或,然后您可以根据需要呼叫evict。但是,您必须先刷新会话,然后再执行此操作。出于充分
问题内容: 每天都会通过Web服务导入数据。 我创建了一个pojo 的 新(临时)实例 ,该 实例 已通过JPA注释在hibernate中进行了映射。 我将来自Web服务的数据填充到临时实例中 我从数据库中加载要使用瞬时实例中的数据更新的持久对象。 我以某种方式将此瞬态实例与持久实例合并。如果持久对象在其字段之一上具有非null值,则不会被瞬态对象上的潜在null值覆盖。基本上,我不想丢失任何数据
使用 Session.delete() 会把对象的状态从数据库中移除。当然,你的应用程序可能仍然持有一个指向已删除对象的引用。所以,最好这样理解:delete() 的用途是把一个持久实例变成瞬时(transient)实例。 sess.delete(cat); 你可以用你喜欢的任何顺序删除对象,不用担心外键约束冲突。当然,如果你搞错了顺序,还是有可能引发在外键字段定义的 NOT NULL 约束冲突。
Hibernate 认为持久化类(persistent class)新实例化的对象是瞬时(Transient)的。我们可通过将瞬时(Transient)对象与 session 关联而把它变为持久的(Persistent)。 DomesticCat fritz = new DomesticCat(); fritz.setColor(Color.GINGER); fritz.setSex('M');