2016-10-14 11 views
0

everyone。私は休止状態には新しく、オブジェクトの永続性に予期せぬ問題を抱えています。hibernate not-nullプロパティはnullまたは一時的な値を参照します

TAnalysis.java

public class TAnalysis implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private Integer unAnalysis; 

    @JoinColumn(name = "uninttest", referencedColumnName = "un_inttest", nullable = false) 
    @ManyToOne(fetch = FetchType.EAGER, optional = false, cascade = CascadeType.ALL) 
    private TIntTest tIntTest; 

    @OneToOne(optional = false, mappedBy = "tAnalysis", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private TBaseComp tBaseComp; 

    @OneToOne(optional = false, mappedBy = "tAnalysis", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private TWellTest tWellTest; 

    @OneToOne(optional = false, mappedBy = "tAnalysis", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private TGasPart tGasPart; 

    @OneToOne(optional = false, mappedBy = "tAnalysis", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private TAddOnComp tAddOnComp; 
} 

TIntTest.java

public class TIntTest implements Serializable, ISimpleEntity { 

    @Id 
    @GeneratedValue (strategy = GenerationType.SEQUENCE) 
    @Column (name = "un_inttest", nullable = false) 
    private Integer unInttest; 

    @OneToMany (cascade = CascadeType.ALL, mappedBy = "tIntTest") 
    private Set<TAnalysis> tAnalysisSet; 
} 

TBaseComp.java

public class TBaseComp implements Serializable { 

    @Id 
    @Column(name = "un_analysis", nullable = false) 
    private Integer unAnalysis; 

    @MapsId 
    @JoinColumn(name = "un_analysis", referencedColumnName = "un_analysis", nullable = false, insertable = false, updatable = false) 
    @OneToOne(optional = false, fetch = FetchType.EAGER) 
    private TAnalysis tAnalysis; 
} 
:ここに は私のエンティティクラスからの関連抽出物でありますの

他のクラス(TAddOnCompTGasPartとTWellTest)はTAnalysis( "サブクラス" の一種)と[@OneToOne]関係TBaseCompと同じ構造を共有しています。

リストされた関係はすべてnullでなくてはなりません。だから私は新しいTAnalysisインスタンスを維持するときにはTIntTestオブジェクトを指定し、 "サブクラス"インスタンスを作成する必要があります。それは私がそれを行う方法は次のとおりです。

EntityManager em = emf.createEntityManager(); 
TAnalysis an = new TAnalysis(); 
TBaseComp baseComp = new TBaseComp(); 
TGasPart gasPart = new TGasPart(); 
TAddOnComp addInComp = new TAddOnComp(); 
TWellTest wellTest = new TWellTest(); 

an.setTBaseComp(baseComp); 
an.setTGasPart(gasPart); 
an.setTAddOnComp(addInComp); 
an.setTWellTest(wellTest); 

baseComp.setTAnalysis(an); 
gasPart.setTAnalysis(an); 
addInComp.setTAnalysis(an); 
wellTest.setTAnalysis(an); 

TIntTest intTest = em.find(TIntTest.class, 10); 
an.setTIntTest(intTest); 

an = em.merge(an); 
//baseComp = em.merge(baseComp); 
//gasPart = em.merge(gasPart); 
//addOnComp = em.merge(addOnComp); 
//wellTest = em.merge(wellTest); 
//em.persist(an); 
em.getTransaction().commit(); 

マージ操作は、私がrequeredプロパティ値an.setTIntTest(intTest)を指定するので、これはなぜ起こるか私は理解できない例外

org.hibernate.PropertyValueException: not-null property references a null or transient value : org.foladesoft.omnibus_client_maven.entities.TAnalysis.tIntTest" 

をスローします。私はem.persist(an)代わりにマージを使用しますがで別の例外を持って私の問題を解決しようとすると

フェーズコミット:PostgreSQLの外部キー違反の例外は、私は新しいレコードを挿入する前TAddOnCompにレコードを挿入しようとしていることを教えてくれましたTAnalysisに。

私はこれらの問題に遭遇した理由と、自分のアプリケーションを動作させる方法を教えてください。これは新しいエンティティあなたが呼び出すべきであるであるよう

+0

。また、Hibernateにparamsを含む更新クエリを記録させます。 – Kirinya

答えて

0

まず、:

em.persist(an); 

em.persistを呼び出すときにFK違反を取得した理由を()TAddOnCompはそれがTAnalysisに関連してそうだについて何も知らないということですFKを挿入することはできません。

双方向関係の場合常には、メモリ内モデルの関係の両側を維持する必要があります。 TAddOnCompはそれに関連するTAnalysisへの参照を持ち、挿入操作はそれに応じてFKを取得して挿入することができます。

TAnalysis an = new TAnalysis(); 
an.setTBaseComp(baseComp); 
an.setTGasPart(gasPart); 
//etc 
baseComp.setAnalysis(an); 
gasPart.setAnalysis(an); 
//etc 
em.persist(an); 

理想的には、これらの操作をカプセル化する必要があります:私はem.findがnull以外TIntTestを返すかどうかをデバッグするrecommen

public class TAnalysis implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private Integer unAnalysis; 

    private TAddOnComp tAddOnComp; 

    public void setTAddOnComp(TAddOnComp tAddOnComp){ 
     this.tAddOnComp = tAddOnComp; 

     if(! tAddOnComp.getTAnalysis != this){ 
      tAddOnComp.setTAnalysis(this); 
     } 

     // and do the same on the other side of the relationship 
    } 
} 
関連する問題