1. ホーム
  2. java

[解決済み] JPA/EJBコードでの「detached entity passed to persist error」(永続化するために渡された離脱した実体)。

2023-08-01 04:07:02

質問

私はこの基本的な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の割り当てを削除すると直りました。

しかし、私はそれを得ることができませんでした、私はコードが動作するようにするために何を修正する必要がありますか?

どのように解決するのですか?

2つのエンティティがあるとします。 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;

}

persistやmergeの前にしなければならないことは、それぞれの写真にアルバムリファレンスを設定することです。

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

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

以上が、永続化・マージする前に関連するエンティティをアタッチする方法です。