を永続ない: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をカスケードしないのはなぜですか? ありがとう!
を試してみてください? – Jobin
getDummyProject()とgetDummyTasks()を確認してください。私はヌルの属性がいくつかあると思います。 –
私はあなたが最も可能性の高いリレーションシップの両側を設定していない – garfield