0

それぞれT_ACCOUNTT_ACCOUNT_BENEFICIARYという名前の 2 つの DB テーブルがあります。

これらのテーブルの構造は次のとおりです。

create table T_ACCOUNT (ID integer identity primary key, NUMBER varchar(9), NAME varchar(50) not null, CREDIT_CARD varchar(16), unique(NUMBER));

create table T_ACCOUNT_BENEFICIARY (ID integer identity primary key, ACCOUNT_ID integer, NAME varchar(50), ALLOCATION_PERCENTAGE decimal(5,2) not null, SAVINGS decimal(8,2) not null, unique(ACCOUNT_ID, NAME));

また、T_ACCOUNTテーブルはT_ACCOUNT_BENEFICIARYテーブルに 1 対多の関係でバインドされています。これをグラフィカルに表現します。

ここに画像の説明を入力

これは、 T_ACCOUNTテーブルをマップするAccountという名前の最初のクラスです。

@Entity
@Table(name="T_ACCOUNT")
public class Account {

    @Id
    @GeneratedValue
    @Column(name="id")
    private Long entityId;

    @Column(name="NUMBER")
    private String number;

    @Column(name="NAME")
    private String name;

    @OneToMany
    @JoinColumn(name="ACCOUNT_ID")
    private Set<Beneficiary> beneficiaries = new HashSet<Beneficiary>();

    @Column(name="CREDIT_CARD")
    private String creditCardNumber;

    // GETTERS & SETTERS
}

これは、 T_ACCOUNT_BENEFICIARYテーブルをマップする受益者クラスです。

/**
 * A single beneficiary allocated to an account. Each beneficiary has a name (e.g. Annabelle) and a savings balance
 * tracking how much money has been saved for he or she to date (e.g. $1000).
 */
@Entity
@Table(name="T_ACCOUNT_BENEFICIARY")
public class Beneficiary {

    @Id
    @GeneratedValue
    @Column(name="ID")
    private Long entityId;

    @Column(name="NAME")
    private String name;

    @Embedded
    @AttributeOverride(name="value",column=@Column(name="ALLOCATION_PERCENTAGE"))
    private Percentage allocationPercentage;

    @Embedded
    @AttributeOverride(name="value",column=@Column(name="SAVINGS"))
    private MonetaryAmount savings = MonetaryAmount.zero();

アカウントを見るとわかるように、 1 対 5の関係を実装する受益者フィールドがあります。

@OneToMany
@JoinColumn(name="ACCOUNT_ID")
private Set<Beneficiary> beneficiaries = new HashSet<Beneficiary>();

DB では、この関係が T_ACCOUNT_BENEFICIARY テーブルのACCOUNT_IDフィールドによって実装されていることを知っています (したがって、T_ACCOUNT_BENEFICIARYテーブルの複数の行がACCOUNT_IDフィールドの同じ値を持つことができ、これは T_ACCOUNTテーブルの単一の行がT_ACCOUNT_BENEFICIARYテーブルの複数の行に関連付けられています)。

前の sippet でわかるように、@JoinColumn(name="ACCOUNT_ID")注釈があります。

私の疑問は、私のT_ACCOUNT_BENEFICIARYテーブルにACCOUNT_ID列があるという事実によって生成されます。

create table T_ACCOUNT_BENEFICIARY (ID integer identity primary key, ACCOUNT_ID integer, NAME varchar(50), ALLOCATION_PERCENTAGE decimal(5,2) not null, SAVINGS decimal(8,2) not null, unique(ACCOUNT_ID, NAME));

しかし、この列は、このT_ACCOUNT_BENEFICIARYテーブルをマップする受益者にマップされていないようです。

@JoinColumn (name="ACCOUNT_ID")はリレーショナル レベルで動作しており、受益者エンティティ ( T_ACCOUNT_BENEFICIARY ) によってマップされたテーブルのACCOUNT_ID列で結合操作を実行していますか、何か不足していますか? この結合はどのように正確に実行されますか?

私の解釈が正しければ、エンティティ レベルで作業して、Accountエンティティ クラスの受益者フィールドを、 Beneficiaryエンティティ クラスに挿入され、 T_ACCOUNT_BENEFICIARYテーブルのACCOUNT_ID列をマッピングする新しいaccountIdフィールドに結合すると言うことはできますか?

TNX

4

2 に答える 2

0

あなたの質問を理解しているかどうかわかりません。しかし、@JoinColumn アノテーションで行ったことは正しく、アカウントに複数の受益者がいる場合、Hibernate は適切な SQL ステートメントを実行します。たとえば、アカウントに 2 人の受益者がいる場合、複数の INSERTS を実行します。そして、@JoinColumn アノテーションを使用することは休止状態レベルにあります。受益者エンティティからアカウントにアクセスする場合は、以下のように受益者クラスで双方向関係を定義する必要があります。

@Entity
@Table("T_ACCOUNT_BENEFICIARY")
public class Beneficiary {
 @ManyToOne(mappedBy = "beneficiaries")
 Account account;
 ...
}
于 2015-01-06T20:56:20.337 に答える