2016-11-08 7 views
0

を永続ない:JPAは、私はJPAのアノテーションで、フォロー親/子関係を持つ親子ツリー

@Entity 
@Table(name = "project") 
public class DefaultProject { 
@OneToMany(mappedBy = "project", cascade = CascadeType.PERSIST) 
private List<DefaultTask> tasks = new ArrayList(); ... 
... 
@Table(name = "task") 
public class DefaultTask { 
@ManyToOne(fetch=FetchType.LAZY, optional=false, cascade=CascadeType.PERSIST) 
@JoinColumn(name = "PROJECT_ID", nullable = false) 
private DefaultProject project; ... 

その後、JUnitテストケースでは、私がフォローをしようとしている:

EntityManager entityManager = entityManagerFactory.createEntityManager(); 
entityManager.getTransaction().begin(); 
DefaultProject testProject = getDummyProject();      
testProject.setTasks(getDummyTasks()); 
entityManager.persist(testProject); 
entityManager.getTransaction().commit(); 
entityManager.close(); 

保存エンティティは、独立して作業していて、それらを一緒に保存するときには、私のフォローメッセージを与えている:

javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value : org.demo.todo.entity.DefaultTask.project 

は私には思えます親は子を最初に保存しようとしていますが、非永続親IDは例外を引き起こしています。

この関係を保存する適切な方法は何ですか?

ありがとうございます!

EDIT 1:ログのトレースレベルを有効にした後、私は親エンティティ(DefaultProjectが)IDを取得して参照してください。

DEBUG org.hibernate.id.IdentifierGeneratorHelper: 78 - Natively generated identity: 26 

そして、子供たちにカスケード、何かがnullになったときの後の数行:

TRACE org.hibernate.engine.internal.Cascade: 80 - Processing cascade ACTION_PERSIST_SKIPLAZY for: org.demo.todo.entity.DefaultProject 
TRACE org.hibernate.engine.internal.Cascade: 419 - Cascade ACTION_PERSIST_SKIPLAZY for collection: org.demo.todo.entity.DefaultProject.tasks 
TRACE org.hibernate.jpa.event.internal.core.JpaPersistEventListener$1: 79 - Cascading persist to : org.demo.todo.entity.DefaultTask 
TRACE org.hibernate.event.internal.AbstractSaveEventListener: 501 - Transient instance of: org.demo.todo.entity.DefaultTask 
TRACE org.hibernate.event.internal.DefaultPersistEventListener: 183 - Saving transient instance 
TRACE org.hibernate.event.internal.AbstractSaveEventListener: 157 - Saving [org.demo.todo.entity.DefaultTask#<null>] 
TRACE org.hibernate.engine.internal.Cascade: 80 - Processing cascade ACTION_PERSIST_SKIPLAZY for: org.demo.todo.entity.DefaultTask 
TRACE org.hibernate.engine.internal.Cascade: 130 - Done processing cascade ACTION_PERSIST_SKIPLAZY for: org.demo.todo.entity.DefaultTask 
TRACE org.hibernate.engine.spi.ActionQueue: 298 - Adding an EntityIdentityInsertAction for [org.demo.todo.entity.DefaultTask] object 
TRACE org.hibernate.engine.spi.ActionQueue: 248 - Executing inserts beforeQuery finding non-nullable transient entities for early insert: [EntityIdentityInsertAction[org.demo.todo.entity.DefaultTask#<null>]] 
TRACE org.hibernate.engine.spi.ActionQueue: 253 - Adding insert with no non-nullable, transient entities: [EntityIdentityInsertAction[org.demo.todo.entity.DefaultTask#<null>]] 

親エンティティIDをカスケードしないのはなぜですか? ありがとう!

+0

を試してみてください? – Jobin

+0

getDummyProject()とgetDummyTasks()を確認してください。私はヌルの属性がいくつかあると思います。 –

+1

私はあなたが最も可能性の高いリレーションシップの両側を設定していない – garfield

答えて

0

は、あなたが完全なクラスDefaultProjectとDefaultTaskを投稿することができます。..以下のコードで

EntityManager entityManager = entityManagerFactory.createEntityManager(); 
EntityTransaction txn = entityManager.getTransaction(); 
txn.begin(); 
DefaultProject testProject = getDummyProject();      
testProject.setTasks(getDummyTasks()); 
entityManager.persist(testProject); 
txn.commit(); 
entityManager.close(); 
+0

こんにちは@ジョビン、あなたの応答に感謝します。悲しいことに、同じ例外がスローされます。私はlog4でTRACEレベルを有効にした後に質問にコメントを追加しました。それが役に立てば幸い!再度、感謝します! – MarcosReyes