2017-11-29 4 views
0

エンベデッドオブジェクトがエンティティへのOneToOneの関係を定義している場合。 Embeddableオブジェクトを使用するEntityは、その関係の列名をどのように上書きできますか。埋め込みオブジェクトを使用した外部キ​​ー列名のオーバーライド

使用して、次のエンティティ:

@Entity 
public class User { 

    @Id 
    private int id; 
    @Embedded 
    private CubeLocation cubeLocation; 
} 

@Embeddable 
public class CubeLocation { 
    @OneToOne 
    private MailBox mailBox;    
    // .. other non-relevant fields 
} 

@Entity 
public class MailBox { 
    @Id 
    private String name; 
    private String cell; 
} 

Userエンティティのためのデータベーステーブルが列IDとMAILBOX_NAMEを持っているでしょう。データベース列の名前はどのようにMAILBOX_NAMEからMBX_IDに変更できますか?

私はUserエンティティにAssociationOverride注釈を定義しようとしましたが、私は、その場合には、このエラーを取得しています:

@Entity 
    @AssociationOverride(
      name="cubeLocation.mailBox", 
      [email protected](name="MBX_ID")) 
    public class User { 
    } 

エラー:

org.hibernate.AnnotationException: Illegal attempt to define a @JoinColumn with a mappedBy association: cubeLocation.mailBox

答えて

1

協会のオーバーライドが組み込み可能に行く必要があります:

@Entity 
public class User { 

    @Id 
    private int id; 

    @Embedded 
    @AssociationOverride(
      name="mailBox", 
      [email protected](name="MBX_ID")) 
    private CubeLocation cubeLocation; 
} 
+0

私はあなたのソリューションを試しましたが、私はまだ同じe rror: 'org.hibernate.AnnotationException:mappedByの関連付けを持つ@JoinColumnを定義しようとする不正な試み:cubeLocation.mailBox' –

+1

うまくいくはずです。私は一時的にオーバーライドを削除し、単に '@JoinColumn(name =" MBX_ID ")'を '@ OneToOne'自体に追加しようとします。その結果は、問題がオーバーライドまたは他のマッピングであるかどうかを示すはずです。 –

+0

'@ JoinColumn'を' @ OneToOne'itに正しく追加すれば(しかしこれは、組み込みオブジェクトを使って他のすべてのエンティティの名前を変更します)。 '@ JoinColumn'を' @ OneToOne'に、 '@ AssociationOverride'をエンティティに追加すると、正しく動作します。しかし、 '@AnnotToOne'の' @ JoinColumn'を設定せずに '@ AssociationOverride'をエンティティに追加すると、' mappedBy associationで@JoinColumnを定義しようとする不正な試み 'エラーが発生します。エンティティで '@ AssociationOverride'を設定できるようにするために、埋め込みで' @ JoinColumn'を設定する必要があるのはなぜですか? –

関連する問題