AssociationOverrideとAssociationOverrides
MappedSuperclassクラスで指定された@JoinColumnsの定義を@AttributeOverrideで上書きできるんだろうかと悩んでたんですが、まさにそれを実現するAssociationOverrideとAssociationOverridesというアノテーションがfinalリリースではjavax.persistenceパッケージに入るみたいです。
https://glassfish.dev.java.net/nonav/javaee5/api/javax/persistence/AssociationOverride.html
https://glassfish.dev.java.net/nonav/javaee5/api/javax/persistence/AssociationOverrides.html
PFDでは@AttributeOverrideが@JoinColumnを上書きできる例が載っているんですが、@JoinColumnの上書きも@AssociationOverrideが担当するようです。@AttributeOverride(s)はBasicなプロパティやフィールドのオーバライド専用、@AssociationOverride(s)はマッピングのプロパティやフィールドのオーバライド専用になるということですね。
Hibernateも3.1.3から対応しているようです。ちょっと動かしてみました。
Addressの複合キー
public class AddressPK implements Serializable { long id1; long id2; }
Addressエンティティ
@Entity @IdClass(AddressPK.class) public class Address { @Id long id1; @Id long id2; }
Superclassクラス : EntityではなくMappedSuperclass
@MappedSuperclass public class Superclass { @ManyToOne @JoinColumns( { @JoinColumn(name = "fk_id1", referencedColumnName = "id1"), @JoinColumn(name = "fk_id2", referencedColumnName = "id2") }) Address address; }
Employeeエンティティ(Superclassを継承している)
@Entity
@AssociationOverride(name = "address", joinColumns = {@JoinColumn(name = "aaa"), @JoinColumn(name = "bbb")})
public class Employee extends Superclass {
@Id
long id;
}
- このとき@AssociationOverrideが有効なのでマッピングされるEmployeeテーブルのカラムは次の3つということです。
- ID
- AAA
- BBB
- ちなみに@AssociationOverrideをはずすとSuperclassクラスの@JoinColumnsの指定が効いてEmployeeテーブルのカラムは次の3つです。
- ID
- FK_ID1
- FK_ID2
- さらにちなみに@AssociationOverrideをはずし、Superclassクラスの@JoinColumnsもはずすとEmployeeテーブルのカラムはデフォルトの名前付けルールが適用されて次の3つになります。
- ID
- ADDRESS_ID1
- ADDRESS_ID2