这是一个想法 -
1.人员表存储人员的详细信息和他/她的地址,
城市和州有各自的表格,
3.地址表包含有关城市和城市所属州的数据,
4.联系表包含联系号码,其中一个人可以有多个联系号码。
以下是MySql表架构设计 -
1。人
的 2。地址
第3。城市
的 4。状态
的 5。接触
我为上面的表格创建了以下域名
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 :(得分:0)
您无法使用@ManyToOne for Set,e,g您使用过的PersonsDomain
@ManyToOne
@JoinColumn(name = "AddressID", nullable = true)
@JsonBackReference
private Set<AddressDomain> addressDomain;
而不是@ManyToOne
,您需要替换为@OneToMany
。
您还需要从此处删除@JoinColumn
,因为在您的情况下,关系是一个方向(PersonsDomain
到AddressDomain
)而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在多个地址上有一个地址,并根据您的要求对其进行更改。