如何正确工作JPA \ Hibernate OneToMany注释?

时间:2015-01-06 17:44:59

标签: java spring hibernate jpa jpa-2.0

我正在学习Spring Core认证,我发现了一些关于如何在练习中使用JPA \ Hibernate的内容。

所以我有2个数据库表名为relativelly T_ACCOUNT T_ACCOUNT_BENEFICIARY

这些表具有以下结构:

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 表格,其中一对多关系,这是图形表示:

enter image description here

这是帐户类的代码,用于映射 T_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 T_ACCOUNT_BENEFICIARY 表之间的一对多关系:

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

我知道,在数据库中,此关系是通过 T_ACCOUNT_BENEFICIARY 表的 ACCOUNT_ID 字段实现的(因此 T_ACCOUNT_BENEFICIARY 的多行> table可以与 ACCOUNT_ID 字段具有相同的值,这意味着 T_ACCOUNT 表的一行可以与 T_ACCOUNT_BENEFICIARY <的多行相关联/ strong> table)。

我的疑问是:在此字段映射中,我没有使用 @Column 注释,因为Beneficiary对象(表示 T_ACCOUNT_BENEFICIARY 表的单行)未表示为我的 T_ACCOUNT 表的字段(列)。因此,使用 @JoinColumn(name =“ACCOUNT_ID”)

但JPA \ Hibernated如何知道什么是正确的表?我认为它必须自动查看如何注释受益人类。

它是否与其工作方式有关的正确解释?

TNX

1 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。您需要做的下一件事是使用@Entity@Table注释来注释您的受益人类。然后hibernate会理解你要做的事情。您尚未发布您的受益人类别,因此我认为这是一种单向关系(即受益人没有@ManyToOne注释)。如果您想在域模型中指定双向关系,则需要在受益人类中添加@ManyToOne注释mappedBy,如下所示。

@Entity
@Table("T_ACCOUNT_BENEFICIARY")
public class Beneficiary {
 @ManyToOne(mappedBy = "beneficiaries")
 Account account;
 ...
}