的Java的Hibernate映射表
这里的想法 -
1人表用于存储人的细节和他/她的地址,
2.城市和国家都有各自单独的表,
3.地址表包含关于城市以及城市属于哪个州的数据,
4.联系表包含联系号码,其中一个人可以有多个联系号码。
以下是MySQL表架构设计 -的Java的Hibernate映射表
我创建了以下领域为上述表 -
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中关系。
你不能使用@ManyToOne的设置,E,G PersonsDomain你已经使用
@ManyToOne
@JoinColumn(name = "AddressID", nullable = true)
@JsonBackReference
private Set<AddressDomain> addressDomain;
,而不是@ManyToOne
,你需要@OneToMany
更换。 你也需要删除从这里@JoinColumn
因为在你的情况下的关系是单向的(PersonsDomain
到AddressDomain
)和PersonDomain
有许多AddressDomain
,所以你不能用它这个场景。 此外,您还使用了参考属性未知CityID
的AddressDomain
。在拥有该关系的@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在许多地址上有一个地址,根据你的要求对其进行更改。