2016-09-28 10 views
0

以下の2つのハイバネートクラスが投稿されています。また、以下に投稿されたpopulateAuthorTableメソッドに記載されているコードを使用してTestAuthorテーブルにレコードを挿入しようとしています。私はセッションを永続化すると分離されたエンティティが継承エラーになる

detached entity passed to persist: msc.hibernate.persistence.TestAuthor 

を受け取るコードを実行すると は私がpopulateAuthorTableこのエラーを解決する方法

を教えてください:

private void populateAuthorTable() { 
    // TODO Auto-generated method stub 
    Session session = HibernateUtil.getCurrentSession(); 
    Transaction transaction = session.beginTransaction(); 
    ArrayList<TestAuthor> authorsList = new ArrayList<>(); 

    for (Long i = (long) 0; i < 30; i++) { 
     authorsList.add(new TestAuthor(i, "FName_" + i, "LName_" + i)); 
    } 

    int i = 0; 
    for (TestAuthor ta : authorsList) { 
     session.persist(ta); 
     i++; 
    } 
} 

TestAuthor

@Entity 
@Table(schema = "afk_owner", name = "testauthor") 
public class TestAuthor { 

@Id 
@Column(name = "authorid") 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequencegen") 
@SequenceGenerator(name = "sequencegen", sequenceName = "afk_owner.testauthor_seq", allocationSize = 1) 
private Long mAuthorID; 

@Column(name = "FNAME") 
private String mFName; 

@Column(name = "LNAME") 
private String mLName; 

@OneToMany(mappedBy = "author", cascade = CascadeType.ALL) 
private List<TestBook> booksList; 

public Long getmAuthorID() { 
    return mAuthorID; 
} 

public List<TestBook> getBooksList() { 
    return booksList; 
} 

public void setBooksList(List<TestBook> booksList) { 
    this.booksList = booksList; 
} 

public void setmAuthorID(Long mAuthorID) { 
    this.mAuthorID = mAuthorID; 
} 

public String getmFName() { 
    return mFName; 
} 

public void setmFName(String mFName) { 
    this.mFName = mFName; 
} 

public String getmLName() { 
    return mLName; 
} 

public void setmLName(String mLName) { 
    this.mLName = mLName; 
} 

public TestAuthor() { 
} 

public TestAuthor(Long id, String fName, String lName) { 
    this.mAuthorID = id; 
    this.mFName = fName; 
    this.mLName = lName; 
    this.booksList = new ArrayList<>(); 
} 

}

答えて

0

新しいオブジェクトの@Idフィールドを設定すると、hibernateはそれが分離されたエンティティだと考えます。作成したシーケンスジェネレータのポイントは、新しいエンティティのIDを生成することです。 IDを設定しないでください。うまくいくはずです。非常にラフなソリューション:あなたのオブジェクトが本当にデタッチされたとき

public TestAuthor(Long id, String fName, String lName) { 
    //this.mAuthorID = id; 
    this.mFName = fName; 
    this.mLName = lName; 
    this.booksList = new ArrayList<>(); 
} 

通常このエラーになるだろう、ちょうど誤って新鮮なものを開始しません。

関連する問題