gpt4 book ai didi

hibernate - "detached entity passed to persist"显式设置 id 并在列上使用 @GeneratedValue

转载 作者:行者123 更新时间:2023-12-05 04:25:55 33 4
gpt4 key购买 nike

我有一个具有自动生成值的实体:

@Entity
public class MyEntity {

@Id
@GeneratedValue(generator = "myuuid-generator")
@GenericGenerator(name = "myuuid-generator", strategy = "com.foo.hibernate.MyUUIDGenerator")
@Column
@AccessType(value = "property")
private String id;

// ...
}

在某些情况下,我想明确设置 ID,所以我覆盖了标识符生成器:

public class MyUUIDGenerator extends UUIDHexGenerator {

@Override
public Serializable generate(SessionImplementor session, Object object) {
MyEntity entity = (MyEntity) object;
String explicitId = entity.getId();
if (explicitId != null) {
return explicitId;
}
return super.generate(session, object);
}

}

不幸的是不起作用:

MyEntity entity = new MyEntity();
entity.setId("bar");
session.persist(entity);
session.flush();

错误:

org.hibernate.PersistentObjectException: detached entity passed to persist: com.foo.MyEntityat org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:124)at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:775)at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:748)at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:753)

我使用 Hibernate 5.0.10.Final。

我的代码有什么问题?

感谢您的帮助。

最佳答案

原因:
你传递一个填充了Id的实体,Hibernate认为这个实体已经存在并且确定这个实体是分离的。

解决方案 1: hibernate
对于Hibernate,我们可以使用Session.save而不是 Session.persist . Save 方法能够处理手动定义的 Id 并且仍然将实体确定为 transient 。
根据文档:

Persist the given transient instance, first assigning a generatedidentifier. (Or using the current value of the identifier property ifthe assigned generator is used.) This operation cascades to associatedinstances if the association is mapped with cascade="save-update"

        MyEntity entity = new MyEntity();
entity.setId("bar");
session.save(entity);
session.flush();

解决方案 2:JPA
Hibernate Save 方法不符合JPA规范。
对于JPA,我们可以使用EntityManager.merge而不是 EntityManager.persist .
Merge 方法将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与 session 关联的持久实例,它将被加载。返回持久实例。如果给定的实例未保存,则保存一份副本并将其作为新的持久实例返回。
因此,合并是获取处于分离状态的传入实体实例并将其数据复制到新托管实例的过程。

        MyEntity entity = new MyEntity();
entity.setId("bar");
entityManager.merge(entity);
entityManager.flush();

关于hibernate - "detached entity passed to persist"显式设置 id 并在列上使用 @GeneratedValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73136683/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com