0

这里的想法 -

1人表用于存储人的细节和他/她的地址
2.城市和国家都有各自单独的表,
3.地址表包含关于城市以及城市属于哪个州的数据
4.联系表包含联系号码,其中一个人可以有多个联系号码

以下是MySQL表架构设计 -的Java的Hibernate映射表

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中关系。

回答

0

你不能使用@ManyToOne的设置,E,G PersonsDomain你已经使用

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

,而不是@ManyToOne,你需要@OneToMany更换。 你也需要删除从这里@JoinColumn因为在你的情况下的关系是单向的(PersonsDomainAddressDomain)和PersonDomain有许多AddressDomain,所以你不能用它这个场景。 此外,您还使用了参考属性未知CityIDAddressDomain。在拥有该关系的@OneToMany mappedBy字段中使用。该元素仅在关联的逆(非拥有)侧指定。 请从下面将其删除:

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

而且它是一个很好的做法使用对象(实体)的名称,而不是用于表示一个对象数据库ID列,因为你已经使用ContactDomain - >

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有许多statedomin,这样你就可以在这个这个关系,也是在这里另一个东西,但它的依赖根据您的要求,您需要根据您的要求更改事情。 同样根据你的mysql模式用户有一个地址,但你在persondomin中使用了一组address,所以请确保Person在许多地址上有一个地址,根据你的要求对其进行更改。