数据库中有两张表,一张客户表,一张字典表(存放一些常量值,如:客户所属行业:“教育、医疗、金融…”,客户来源:“网络营销,电话营销”,客户的级别:“普通客户,vip客户,vip中p客户”)。客户表与字典表存在外键关联关系,如下图。
字典表和客户表的实体类如下:
public class Dict {
//(简洁省略普通字段)
//(关联字段)一对多
// 注意到一个细节是,这里多方的set集合我们没有选择手动初始化
@JSONField(serialize = false)//FastJson,取消字段的循环引用
private Set<Customer> sourceSet;
@JSONField(serialize = false)
private Set<Customer> industrySet;
@JSONField(serialize = false)
private Set<Customer> levelSet;
//下面是setter和getter
...
}
public class Customer {
//(简洁省略普通字段)
// 外键字段(javaBean对象中,不出现外键字段由实体对象取代)
// private String cust_source;
// private String cust_industry;
// private String cust_level;
//外键实体,用来代替外键字段
//Customer 与 Dict 有三条一对多的关联 换句话说: Customer有三个外键
private Dict source;
private Dict industry;
private Dict level;
//下面是setter和getter
...
}
字典表和客户表的映射文件如下:
<hibernate-mapping>
<class name="me.arjenlee.domain.Dict" table="base_dict">
<id name="dict_id" column="dict_id">
<generator class="uuid"/>
</id>
<property name="dict_type_code" column="dict_type_code"/>
<property name="dict_type_name" column="dict_type_name"/>
<property name="dict_item_name" column="dict_item_name"/>
<property name="dict_item_code" column="dict_item_code"/>
<property name="dict_sort" column="dict_sort"/>
<property name="dict_enable" column="dict_enable"/>
<property name="dict_memo" column="dict_memo"/>
<!-- 配置一方 -->
<!-- 一方: source -->
<set name="sourceSet" inverse="true">
<key column="cust_source"/>
<one-to-many class="me.arjenlee.domain.Customer"/>
</set>
<!-- 一方: industry -->
<set name="industrySet" inverse="true">
<key column="cust_industry"/>
<one-to-many class="me.arjenlee.domain.Customer"/>
</set>
<!-- 一方: level -->
<set name="levelSet" inverse="true">
<key column="cust_level"/>
<one-to-many class="me.arjenlee.domain.Customer"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="me.arjenlee.domain.Customer" table="cst_customer">
<id name="cust_id" column="cust_id">
<generator class="native"/>
</id>
<property name="cust_name" column="cust_name"/>
<property name="cust_user_id" column="cust_user_id"/>
<property name="cust_create_id" column="cust_create_id"/>
<property name="cust_linkman" column="cust_linkman"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
<property name="filePath" column="filePath"/>
<!-- 外键 多对一 -->
<many-to-one name="source" class="me.arjenlee.domain.Dict" column="cust_source"/>
<many-to-one name="industry" class="me.arjenlee.domain.Dict" column="cust_industry"/>
<many-to-one name="level" class="me.arjenlee.domain.Dict" column="cust_level"/>
</class>
</hibernate-mapping>
测试:通过查询字典表,发现字典表中的set集合框架已经帮我们实例化了,而且也装入了相应的customer对象。
public class DictDaoImpl extends HibernateDaoSupport implements DictDao {
@Override
public List<Dict> findByCode(String dict_type_code) {
List<Dict> result= (List<Dict>)this.getHibernateTemplate().find("from Dict where dict_type_code = ?", dict_type_code);
return result;
}
}
总结:hibernate5 一对多映射,我们没有手动将实体对象中的set集合实例化(如下所示:),框架也会自动实例化实体对象中的set集合,并装入对应的值。
private Set<Customer> sourceSet;
private Set<Customer> industrySet;
private Set<Customer> levelSet;