在多表映射配置时,我们应该遵循以下不步骤:
- 确定两张表之间的关系
- 在数据库中实现两张表之间的关系建立
- 在实体类中描述出两个实体类之间的关系
- 在映射配置文件中建立两个实体和两张表之间的关系
我们就按照上面的步骤做,我这里有一张联系人表和一张客户表,一对多关系,实体类代码如下:
/*** 客户的实体类* @author dengg**/
public class Customer {private Long custId;private String custName;private String custSource;private String custIndustry;private String custLevel;private String custAddress;private String custPhone;public Long getCustId() {return custId;}public void setCustId(Long custId) {this.custId = custId;}public String getCustName() {return custName;}public void setCustName(String custName) {this.custName = custName;}public String getCustSource() {return custSource;}public void setCustSource(String custSource) {this.custSource = custSource;}public String getCustIndustry() {return custIndustry;}public void setCustIndustry(String custIndustry) {this.custIndustry = custIndustry;}public String getCustLevel() {return custLevel;}public void setCustLevel(String custLevel) {this.custLevel = custLevel;}public String getCustAddress() {return custAddress;}public void setCustAddress(String custAddress) {this.custAddress = custAddress;}public String getCustPhone() {return custPhone;}public void setCustPhone(String custPhone) {this.custPhone = custPhone;}@Overridepublic String toString() {return "Customer [custId=" + custId + ", custName=" + custName + ", custSource=" + custSource+ ", custIndustry=" + custIndustry + ", custLevel=" + custLevel + ", custAddress=" + custAddress+ ", custPhone=" + custPhone + "]";}public Customer(Long custId, String custName) {super();this.custId = custId;this.custName = custName;}public Customer() {}}
/*** 联系人的实体类* @author dengg**/
public class LinkMan implements Serializable {private Long lkmId;private String lkmName;private String lkmPhone;private String lkmMobile;private String lkmEmail;private String lkmPosition;private String lkmMemo;public Long getLkmId() {return lkmId;}public void setLkmId(Long lkmId) {this.lkmId = lkmId;}public String getLkmName() {return lkmName;}public void setLkmName(String lkmName) {this.lkmName = lkmName;}public String getLkmPhone() {return lkmPhone;}public void setLkmPhone(String lkmPhone) {this.lkmPhone = lkmPhone;}public String getLkmMobile() {return lkmMobile;}public void setLkmMobile(String lkmMobile) {this.lkmMobile = lkmMobile;}public String getLkmEmail() {return lkmEmail;}public void setLkmEmail(String lkmEmail) {this.lkmEmail = lkmEmail;}public String getLkmPosition() {return lkmPosition;}public void setLkmPosition(String lkmPosition) {this.lkmPosition = lkmPosition;}public String getLkmMemo() {return lkmMemo;}public void setLkmMemo(String lkmMemo) {this.lkmMemo = lkmMemo;}@Overridepublic String toString() {return "LinkMan [lkmId=" + lkmId + ", lkmName=" + lkmName + ", lkmPhone=" + lkmPhone + ", lkmMobile="+ lkmMobile + ", lkmEmail=" + lkmEmail + ", lkmPosition=" + lkmPosition + ", lkmMemo=" + lkmMemo + "]";}}
第二步在数据库中实现两张表之间的关系建立,因为我用了hibernate,会自动创建,就不弄了
第三步在实体类中描述出两个实体类之间的关系:
首先我们在Customer类中配置LinkMan类的关系,一个客户对应多个联系人
我们在Customer加入如下代码:
private Set<LinkMan> likmans = new HashSet<LinkMan>(0);public Set<LinkMan> getLikmans() {return likmans;}public void setLikmans(Set<LinkMan> likmans) {this.likmans = likmans;}
主表应该包含从表实体的集合引用,用set集合来建立关系,再配置set和get方法,就行了。
接着配置LinkMan,加入代码如下:
private Customer customer;public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}
第四步在映射配置文件中建立两个实体和两张表之间的关系:
我们先打开Customer.hbm.xml文件,里面加入配置如下:
<set name="likmans" table="cust_linkman"><key column="lkm_cust_id"></key><one-to-many class="LinkMan"/></set>
name:就是我们在Customer类中设置set集合的名字
table:指定从表的名字,也就是联系人表名
key:指定外键字段名
one-to-many:指定从表实体名称
然后打开LinkMan.hbm.xml文件,在里面加入如下代码:
<many-to-one name="customer" class="Customer" column="lkm_cust_id"></many-to-one>
name:从表实体引用主表实体对象引用的名称吗,就是在LinkMan类中设置Customer对象的名称
class:指定属性所对应的实体类名称,就是Customer路径
column:指定外键的名称