Java Hibernate表映射

时间:2017-04-09 09:19:06

标签: java mysql hibernate hibernate-mapping hibernate-annotations

这是一个想法 -

1.人员表存储人员的详细信息和他/她的地址
城市和州有各自的表格,
3.地址表包含有关城市和城市所属州的数据,
4.联系表包含联系号码,其中一个人可以有多个联系号码

以下是MySql表架构设计 -

1。人
enter image description here

2。地址
enter image description here

第3。城市
enter image description here

4。状态
enter image description here

5。接触
enter image description here

我为上面的表格创建了以下域名

1。 PersonsDomain

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PersonID")
    private int personId;

    @Column(name = "FirstName")
    private String firstName;

    @Column(name = "Age")
    private int age;

    @Column(name = "DateOfBirth")
    private Date dateOfBirth;

    @OneToMany(mappedBy = "PersonID", cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
    @JsonBackReference
    private Set<ContactDomain> contactDomain;

    @ManyToOne
    @JoinColumn(name = "AddressID", nullable = true)
    @JsonBackReference
    private Set<AddressDomain> addressDomain;


2。 AddressDomain

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "AddressID")
    private int addressId;

    @OneToOne(mappedBy = "CityID", cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
    @Fetch(FetchMode.JOIN)
    @JsonBackReference
    private CityDomain cityDomain;

    @ManyToOne
    @JoinColumn(name = "StateID", nullable = true)
    @JsonBackReference
    private StateDomain stateDomain;


第3。 CityDomain

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "CityID")
    private int cityId;

    @Column(name = "CityName")
    private String cityName;


4。 StateDomain

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "StateID")
    private int stateId;

    @Column(name = "StateName")
    private String stateName;


5。 ContactDomain

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ContactID")
    private int contactId;

    @Column(name = "ContactNumber")
    private int contactNumber;

    @ManyToOne
    @JoinColumn(name = "PersonID", nullable = true)
    @JsonBackReference
    private PersonsDomain personId;

    @Column(name = "Description")
    private String description;



我想知道我是否正确映射了Hibernate中的关系。

1 个答案:

答案 0 :(得分:0)

您无法使用@ManyToOne for Set,e,g您使用过的PersonsDomain

 @ManyToOne
    @JoinColumn(name = "AddressID", nullable = true)
    @JsonBackReference
    private Set<AddressDomain> addressDomain;

而不是@ManyToOne,您需要替换为@OneToMany。 您还需要从此处删除@JoinColumn,因为在您的情况下,关系是一个方向(PersonsDomainAddressDomain)而PersonDomain有很多AddressDomain,所以你可以不要在这种情况下使用它。 您还在CityID中使用了引用属性unknown AddressDomain。在@OneToMany中,mappedBy字段使用拥有该关系。此元素仅在关联的反向(非拥有)侧指定。 请从下面删除它:

@OneToOne(mappedBy = "CityID", cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
    @Fetch(FetchMode.JOIN)
    @JsonBackReference
    private CityDomain cityDomain;

同样,使用对象(实体)名称代替数据库Id列来表示对象也是一种很好的做法,因为您使用了ContactDomain - &gt;

 private PersonsDomain personId;

因此,如果您使用字段名personsDomain而不是personId,那将会很好,因为OOP编程人员可以创建很多场景。

我已更新您在说明中提及的实体: 的 PersonDomain:

@Entity
public class PersonsDomain {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "PersonID")
private int personId;

    @Column(name = "FirstName")
    private String firstName;

    @Column(name = "Age")
    private int age;

    @Column(name = "DateOfBirth")
    private Date dateOfBirth;

    @OneToMany(mappedBy = "personId", cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
    private Set<ContactDomain> contactDomain;

    @OneToMany
    private Set<AddressDomain> addressDomain;
}

<强> AddressDomain:

@Entity
public class AddressDomain {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "AddressID")
    private int addressId;

    @OneToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
    @Fetch(FetchMode.JOIN)
    private CityDomain cityDomain;

    @ManyToOne
    @JoinColumn(name = "StateID", nullable = true)
    private StateDomain stateDomain;

}

<强> CityDomain:

@Entity
public class CityDomain {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "CityID")
    private int cityId;

    @Column(name = "CityName")
    private String cityName;
}

<强> ContactDomain:

@Entity
public class ContactDomain {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ContactID")
    private int contactId;

    @Column(name = "ContactNumber")
    private int contactNumber;

    @ManyToOne
    @JoinColumn(name = "PersonID", nullable = true)
    private PersonsDomain personsDomain;

    @Column(name = "Description")
    private String description;
}

<强> StateDomain:

@Entity
public class StateDomain {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "StateID")
    private int stateId;

    @Column(name = "StateName")
    private String stateName;
}

另外还有一个citydmoin有很多声明,所以你可以这个关系,这里也是另一件事,但它取决于你的要求所以你需要根据你的要求改变一些东西。 另外,根据您的mysql架构,用户有一个地址,但您在address中使用了persondomin,因此请确保Person在多个地址上有一个地址,并根据您的要求对其进行更改。