0

が、私はかなり簡単な1対多の関係を持って設定し得ていないHibernateは多くの1つの外部キーが

[SampleAliasMask] has many [SampleAliasMaskPart] 

私の問題は、私は、コレクションの部品でSampleAliasMaskの新しいインスタンスを永続化するとき私が得ることですSampleAliasMaskPartのテーブルからSampleAliasMaskへの外部キーリンクがNULLに設定されているという制約違反です。

私は、次のような注釈を休止状態使用してマッピングしています:

@Entity 
@Table(name="SAMPLE_ALIAS_MASK") 
public class SampleAliasMask extends ClientEntity { 
    @OneToMany(mappedBy = "sampleAliasMask", fetch = FetchType.EAGER, cascade = javax.persistence.CascadeType.ALL, orphanRemoval = true) 
    @Cascade(CascadeType.ALL) 
    @Length(min = 1, message = "The sample alias mask must have components") 
    private Set<SampleAliasMaskPart> components; 

ようにマッピングされた関係の他の半分:

@Entity 
@Table(name="SAMPLE_ALIAS_MASK_PART") 
public class SampleAliasMaskPart extends ClientEntity { 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    @JoinColumn(name = "SAMPLE_ALIAS_MASK_ID", nullable = false) 
    private SampleAliasMask sampleAliasMask; 

ClientEntityの関連部分が

@MappedSuperclass 
public abstract class ClientEntity { 
    @Id 
    @Column(name="ID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
です

私はこのような部分を作成しています:

HashSet<SampleAliasMaskPart> components = new HashSet<>(); 
for(Map<String, Object> c : this.components) { 
    SampleAliasMaskPart component = new SampleAliasMaskPart(Integer.parseInt(c.get("value").toString(), 10), c.get("name").toString()); 
    result.validate(component); 
    components.add(component); 
} 
mask.setComponents(components); 

私が手に正確なエラーは次のとおりです。

java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("ST"."SAMPLE_ALIAS_MASK_PART"."SAMPLE_ALIAS_MASK_ID") 

私は、問題は、私が明示的にSampleAliasMaskPart.sampleAliasMask設定されていないという事実に関係している疑いがあるが、私はその理由をする必要がありますか?その関係は決して公開されず、ナビゲートされません。そのフィールドはマッピング目的のためだけにあり、私はこれを間違ってマッピングしていると思います。

+1

あなたの質問には答えられないが、あなたが知りたいと思ったので、コメントとして追加する。 '@ Length'は文字列の長さを検証します。代わりに '@ Size'が必要です。 –

+0

ありがとう、それは私が望んでいた、はい –

答えて

1

あなたの仮定は正しいです。 Hibernateは、関連が存在するかどうかを知るために、関連の所有サイドを使用します。そして、所有側はmappedBy属性がない側にあります。

一般的なルールは、双方向の関連付けがある場合、関連の両側を初期化/変更することによってオブジェクトグラフを一貫性のあるものにすることはあなたの責任です。 Hibernateはそれについてはあまり気にしませんが、所有サイドを初期化しなければ、関連を維持しません。

この関連付けを双方向にする必要はありません。そうしないと、この面(ユニークな面)が所有側であるため、マスクに部品を追加するだけで十分です。

+0

待って、私はちょうどSampleAliasMaskPartからそのプライベートフィールドを削除することができますか?どのように外部キー列の名前を指定するのですか? –

+0

関連の反対側です。 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-mappingを参照してください。 –

0

JB Nizetが正しく提案しました。あなたはそれを解決する方法は2つあります。

双方向の関係を削除
  1. SampleAliasMaskPart

  2. simpleAliasMaskから注釈@ManyToOne(optional = false, fetch = FetchType.LAZY)を削除component.setSimpleAliasMask(mask)ような何かを行うことによって、各componentmaskを追加します。これは双方向の関係になります。

関連する問題