21

私の質問に対するいくつかの良い答えに出くわしましたが、これはHibernate3.4.0GAからHibernate4.1.8へのアップグレードに関するものです。そのため、これは以前のバージョンで機能していました。この新しいバージョンで壊れた理由を高低で検索しました。

私は

org.hibernate.TransientObjectException:オブジェクトは保存されていない一時インスタンスを参照します-フラッシュする前に一時インスタンスを保存します:com.test.server.domain.model.NoteItem.note-> com.test.server.domain.model.Note

どんな助けでも素晴らしいでしょう。

これが私のクラスです。

@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();
    }
}   
4

2 に答える 2

34

NoteItem前に保存する必要がある一時的な(まだ保存されていない)インスタンスを参照しますNote。したがって、プロパティノートで「Cascade.all」を指定するか、最初にノートでsaverupdateを呼び出します。

于 2012-11-28T09:15:15.573 に答える
0

楽観的ロック(@Version)を導入した後、すべてのPUTHTTPトランザクションで同じエラーに直面していました

エンティティを更新するときに、そのエンティティのIDとバージョンを送信する必要があります。エンティティフィールドのいずれかが他のエンティティに関連している場合は、そのフィールドにもIDとバージョンの値を指定する必要があります。それがない場合、JPAは最初にその関連エンティティを永続化しようとします。

:2つのエンティティがあります-> Vehicle(id、Car、version); 車両エンティティを更新/永続化するための車(ID、バージョン、ブランド)は、車両エンティティの車フィールドにIDフィールドとバージョンフィールドが提供されていることを確認します

于 2020-07-26T13:39:27.907 に答える