unidirectional onetomany one many example ejemplo hibernate jpa hibernate-onetomany

hibernate - onetomany - TransientObjectException: el objeto hace referencia a una instancia transitoria no guardada: guarda la instancia transitoria antes de enjuagar



relation one to many hibernate (1)

He encontrado algunas buenas respuestas posibles a mis preguntas, pero esto se refiere a una actualización de Hibernate 3.4.0GA a Hibernate 4.1.8. Así que esto solía funcionar en la versión anterior y he buscado alto y bajo por qué se está rompiendo en esta nueva versión.

Yo tengo un

org.hibernate.TransientObjectException: el objeto hace referencia a una instancia transitoria no guardada: guarde la instancia transitoria antes de limpiar: com.test.server.domain.model.NoteItem.note -> com.test.server.domain.model.Note

Cualquier ayuda sería genial.

Aquí están mis clases.

@MappedSuperclass public abstract class EntityBase implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID") protected Long id; @Version @Column(name = "VERSION") protected Long version; public Long getId() { return id; } public Long getVersion() { return version; } protected static final EntityManager entityManager() { return EntityManagerUtil.getEntityManager(); } } @Entity @Table(name = "WORK_BOOK") public class WorkBook extends EntityBase { private static final long serialVersionUID = 1L; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "NOTE_ID") private Note note; public WorkBook() { super(); } public Note getNote() { return note; } public void setNote(Note note) { this.note = note; } public WorkBook persist() { EntityManager em = entityManager(); EntityTransaction tx = em.getTransaction(); if (tx.isActive()) { return em.merge(this); } else { tx.begin(); WorkBook saved = em.merge(this); tx.commit(); return saved; } } } @Entity @Table(name = "NOTE") public class Note extends EntityBase { private static final long serialVersionUID = 1L; @OneToOne(mappedBy = "note") private WorkBook workBook; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "note") private List<NoteItem> notes = new ArrayList<NoteItem>(); public WorkBook getWorkBook() { return workBook; } public List<NoteItem> getNotes() { return notes; } public void setWorkBook(WorkBook workBook) { this.workBook = workBook; } public void setNotes(List<NoteItem> notes) { if (notes != null) { for (NoteItem ni : notes) { ni.setNote(this); } } this.notes = notes; } } @Entity @Table(name = "NOTE_ITEM") public class NoteItem extends EntityBase { private static final long serialVersionUID = 1L; @Column(name = "NOTE_NAME") private String noteName; @Column(name = "NOTE_TEXT") private String noteText; @Column(name = "NOTE_DATE") private Date noteDate; @Column(name = "NOTE_CREATOR") private String noteCreator; @Column(name = "NOTE_CREATOR_ID") private Integer noteCreatorId; @ManyToOne @JoinColumn(name = "NOTE_ID", updatable = true) private Note note; public String getNoteName() { return noteName; } public void setNoteName(String noteName) { this.noteName = noteName; } public String getNoteText() { return noteText; } public void setNoteText(String noteText) { this.noteText = noteText; } public Date getNoteDate() { return noteDate; } public void setNoteDate(Date noteDate) { this.noteDate = noteDate; } public String getNoteCreator() { return noteCreator; } public void setNoteCreator(String noteCreator) { this.noteCreator = noteCreator; } public Integer getNoteCreatorId() { return noteCreatorId; } public void setNoteCreatorId(Integer noteCreatorId) { this.noteCreatorId = noteCreatorId; } public Note getNote() { return note; } public void setNote(Note note) { this.note = note; } public NoteItem create() { return new NoteItem(); } }


NoteItem referencia a una instancia de Note transitoria (aún no guardada) que se debe guardar antes. Entonces especifique "Cascade.all" en la nota de propiedad o llame a saveorupdate en Note primero.