私は現在、EJBの速度に近づいています(戻ってきています)。しかし、私は苦労している概念に出くわし、それは私たちのコードで使用されているように見えるので、よりよく理解したいと思っています(私と私の頭のすべての声ではなく).
これが私が本で見つけた例です。これは、@EmbeddedId
アノテーションの使用方法を示す例の一部です。
@Entity
public class Employee implements Java.io.Serializable
{
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="lastName", column=@Column(name="LAST_NAME"),
@AttributeOverride(name="ssn", column=@Column(name="SSN"))
})
private EmbeddedEmployeePK pk;
...
}
EmbeddedEmployeePK
クラスは、@Embeddable
のペアを定義するかなり単純な@Columns
クラスです:lastName
とssn
。
ああ、私はこの例を、Rubinger&BurkeによるO'ReillyのEnterprise JavaBeans 3.1から取り上げました。
助けてくれてありがとう。
埋め込まれたIDを構成する属性には、(明示的または暗黙的なマッピングを介して)事前定義された列名がある場合があると言っています。 @AttributeOverride
を使用することにより、「格納されている列に関する他の情報を無視し、ここで指定したものを使用する」と言っています。
UserDetailsクラスでは、homeAddress
とofficeAddress
をAddress
でオーバーライドしました
このOne Address POJOは、DBの2つのテーブルに対して機能します。
DB:
Table1 Table2
STREET_NAME HOME_STREET_NAME
CITY_NAME HOME_CITY_NAME
STATE_NAME HOME_STATE_NAME
PIN_CODE HOME_PIN_CODE
EmbeddedEmployeePKクラスは、@ ColumnsのペアであるlastNameとssnを定義する非常に単純な@Embeddableクラスです。
まったくそうではありません-EmbeddedEmployeePK
はpropertiesのペアを定義し、列にマッピングされます。 @AttributeOverride
注釈を使用すると、埋め込みクラスのプロパティがマップされる列をオーバーライドできます。
これの使用例は、埋め込み可能なクラスが列名が異なるさまざまな状況で使用され、それらの列マッピングを変更できるようにするための何らかのメカニズムが必要な場合です。たとえば、同じembeddableの2つの個別のインスタンスを含むエンティティがあるとします-両方を同じ列名にマッピングすることはできません。
名前だけでなく、他の列プロパティもオーバーライドできます。
コンポーネントを埋め込むユーザーに基づいてSSNの長さを変更すると仮定します。次のように、列の@AttributeOverride
を定義できます。
@AttributeOverrides({
@AttributeOverride(name = "ssn", column = @Column(name = "SSN", length = 11))
})
private EmbeddedEmployeePK pk;
Hibernate Annotationsドキュメントの "2.2.2.4。埋め込みオブジェクト(別名コンポーネント)" を参照してください。
他の@Column
プロパティ(name
やnullable
など)を保持するために、元の列で指定したものと同じように、オーバーライドされた列でそれらを保持します。
JPAはフィールド名をデータソースの列名にマップしようとするため、ここで見ているのは、フィールド変数の名前とデータベースの列の名前との間の変換です。