带有 JPA/EJB 代码的“分离的实体传递以持久化错误”

2022-08-31 12:11:10

我正在尝试运行这个基本的JPA / EJB代码:

public static void main(String[] args){
         UserBean user = new UserBean();
         user.setId(1);
         user.setUserName("name1");
         user.setPassword("passwd1");
         em.persist(user);
  }

我收到此错误:

javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.JPA.Database

有什么想法吗?

我在互联网上搜索,我发现的原因是:

这是由您创建对象的方式引起的,即,如果您显式设置了ID属性。删除 ID 分配修复了它。

但是我没有得到它,我必须修改什么才能使代码正常工作?


答案 1

发生此错误的原因是设置了对象的 ID。休眠区分瞬态对象和分离对象,并且仅适用于瞬态对象。如果得出的结论是对象已分离(由于设置了 ID,因此将分离),它将返回“分离的对象已传递以持久化”错误。您可以在此处此处找到更多详细信息。persistpersist

但是,这仅适用于指定要自动生成的主键的情况:如果将字段配置为始终手动设置,则代码将正常工作。


答案 2

ERD

假设您有两个实体和 .相册包含许多照片,因此它是一对多关系。AlbumPhoto

相册类

@Entity
public class Album {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    Integer albumId;

    String albumName;

    @OneToMany(targetEntity=Photo.class,mappedBy="album",cascade={CascadeType.ALL},orphanRemoval=true)
    Set<Photo> photos = new HashSet<Photo>();
}

照片类

@Entity
public class Photo{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    Integer photo_id;

    String photoName;

    @ManyToOne(targetEntity=Album.class)
    @JoinColumn(name="album_id")
    Album album;

}

在保留或合并之前,您必须做的是在每张照片中设置相册引用。

        Album myAlbum = new Album();
        Photo photo1 = new Photo();
        Photo photo2 = new Photo();

        photo1.setAlbum(myAlbum);
        photo2.setAlbum(myAlbum);       

这就是在持久化或合并之前附加相关实体的方法。


推荐