Java 休眠 table 映射
Java Hibernate table mapping
思路是这样的 -
1. Person table 存储Person的详细信息和his/her Address,
2. 城市和州有各自的 tables,
3. 地址 table 包含有关 城市的数据以及该城市属于哪个州 、
4. Contact table包含Contact Numbers,其中一个人可以有多个Contact numbers.
以下是MySqlTable模式设计-
1.人数
2。地址
3。城市
4。州
5。联系人
我为上述 Tables 创建了以下域 -
1.人域
@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。地址域
@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。城市域
@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。联系人域
@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 用于 Set,例如您使用的 PersonsDomain
@ManyToOne
@JoinColumn(name = "AddressID", nullable = true)
@JsonBackReference
private Set<AddressDomain> addressDomain;
而不是 @ManyToOne
,您需要用 @OneToMany
替换。
您还需要从此处删除 @JoinColumn
,因为在您的情况下,关系是单向的(PersonsDomain
到 AddressDomain
)并且 PersonDomain
有很多 AddressDomain
,因此您可以在这种情况下使用它。
您还使用了 AddressDomain
中引用的 属性 未知 CityID
。在拥有关系的 @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
会更好,因为 OOPs programming personsDomain making much scene.
我已经更新了您在描述中提到的实体:
个人域:
@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;
}
地址域:
@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;
}
城市域名:
@Entity
public class CityDomain {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "CityID")
private int cityId;
@Column(name = "CityName")
private String cityName;
}
联系人域:
@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 在多个地址上有一个地址,并根据您的要求进行更改。
思路是这样的 -
1. Person table 存储Person的详细信息和his/her Address,
2. 城市和州有各自的 tables,
3. 地址 table 包含有关 城市的数据以及该城市属于哪个州 、
4. Contact table包含Contact Numbers,其中一个人可以有多个Contact numbers.
以下是MySqlTable模式设计-
1.人数
2。地址
3。城市
4。州
5。联系人
我为上述 Tables 创建了以下域 -
1.人域
@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。地址域
@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。城市域
@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。联系人域
@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 用于 Set,例如您使用的 PersonsDomain
@ManyToOne
@JoinColumn(name = "AddressID", nullable = true)
@JsonBackReference
private Set<AddressDomain> addressDomain;
而不是 @ManyToOne
,您需要用 @OneToMany
替换。
您还需要从此处删除 @JoinColumn
,因为在您的情况下,关系是单向的(PersonsDomain
到 AddressDomain
)并且 PersonDomain
有很多 AddressDomain
,因此您可以在这种情况下使用它。
您还使用了 AddressDomain
中引用的 属性 未知 CityID
。在拥有关系的 @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
会更好,因为 OOPs programming personsDomain making much scene.
我已经更新了您在描述中提到的实体: 个人域:
@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;
}
地址域:
@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;
}
城市域名:
@Entity
public class CityDomain {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "CityID")
private int cityId;
@Column(name = "CityName")
private String cityName;
}
联系人域:
@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 在多个地址上有一个地址,并根据您的要求进行更改。