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在許多地址上有一個地址,根據你的要求對其進行更改。