2017-09-18 3 views
0

私はOneToMany-Relationを介して互いに関係する2つのエンティティを持っています。VARCHARSがCLOBに変わったとき、JPA永続化は関係では発生しません

エンティティ1は、「変更」と命名し、以下の

public class Change { 

    String attribute1; 

    @Column(name="\"ATTRIBUTE1\"") 
    public void getAttribute1() { 
    return this.attribute1; 
    } 

    public void setAttribute1(String attribute1) { 
    this.attribute1 = attribute1; 
    } 

    // and 7 more of these.... 

    List<ChangeTask> relatedChangeTasks = new ArrayList<ChangeTask>(); 

    @OneToMany(cascade={PERSIST, MERGE, REFRESH} 
    @JoinTable(name="CHANGE_CHANGETASK", joinColumns={@JoinColumn(name="CHANGE_ID")}, inverseJoinColumns={@JoinColumn(name="CHANGETASK_ID")}) 
    @JoinColumn(name="\"relatedChangeTask_ID\"") 

    public List<ChangeTask> getRelatedChangeTasks() { 
    return this.relatedChangeTasks; 
    } 

    public void setRelatedChangeTasks(List<ChangeTask> relatedChangeTasks) { 
    this.relatedChangeTasks = relatedChangeTasks; 
    } 
} 

エンティティ2のように見えているChangeTask命名し、変更を拡張しています。

public class ChangeTask extends Change { 

    // some additional attributes... 
} 

「relatedChangeTask」リストに1つのChangeTaskを追加して、新しいまたは既存の変更レコードを永続化すると、完璧に機能します。

今、変更は次のようになりますので、私は、デフォルトから@Lobの8つの属性の注釈を変更する必要があります。

public class Change { 

    String attribute1; 

    @Lob 
    @Column(name="\"ATTRIBUTE1\"") 
    @Basic(fetch=EAGER) 

    public String getAttribute1() { 
    if(fieldHandler != null) { 
     return (java.lang.String) fieldHandler.readObject(this, "attribute1", attribute1); 
    } 
    return attribute1; 
    } 

    public void setAttribute1(String attribute1) { 
    if(fieldHandler != null) { 
     this.attribute1= (java.lang.String) fieldHandler.writeObject(this, "attribute1", this.attribute1, attribute1); 
     return; 
    } 
    this.attribute1= attribute1; 
    }  

    // and 7 more of these.... 

    List<ChangeTask> relatedChangeTasks = new ArrayList<ChangeTask>(); 

    @OneToMany(cascade={PERSIST, MERGE, REFRESH} 
    @JoinTable(name="CHANGE_CHANGETASK", joinColumns={@JoinColumn(name="CHANGE_ID")}, inverseJoinColumns={@JoinColumn(name="CHANGETASK_ID")}) 
    @JoinColumn(name="\"relatedChangeTask_ID\"") 

    public List<ChangeTask> getRelatedChangeTasks() { 
    return this.relatedChangeTasks; 
    } 

    public void setRelatedChangeTasks(List<ChangeTask> relatedChangeTasks) { 
    this.relatedChangeTasks = relatedChangeTasks; 
    } 
} 

、私は変更に与えられたChangeTaskを追加しようとすると、インクルードが持続操作は失敗しません。しかし、トランザクションの終わりには、関係は保持されておらず、関係表「CHANGE_CHANGETASK」は空のま​​まであることを意味する。全体のプロセスをデバッグすると、リストには「entityManager.merge()」操作の前に1つのエントリが含まれており、マージ後にまだ1つのエントリが含まれていることがわかります。しかし、決してデータベースには到着しません。

誰も私がここで間違っているアイデアはありますか?聞こえるかもしれない奇妙なことに、それは@Lobアノテーションに関連したものでなければなりません。エンティティからそれらをもう一度削除するとすぐにすべてがうまく動作します。

ありがとうございます。

答えて

1

あなたは正しいことはできません

public void getAttribute1() { 

を書きました。

@Column(name="\"ATTRIBUTE1\"") 
public void setAttribute1(String attribute1) { 
    this.attribute1 = attribute1; 
} 

あなたはフィールドやゲッターのいずれかをannotageする必要があります:私はあなたがさらにあなたがセッターに注釈を付けている

public String getAttribute1() { 

を意味すると思います。

+0

あなたはそうです。ちょっとばかげたコピー貼り付けエラー。コードがコンパイルされます。そのために残念。 –

関連する問題