您的位置:首页 > 其它

hibernate5 一对多映射中set集合的实例化

2018-01-25 10:14 288 查看
数据库中有两张表,一张客户表,一张字典表(存放一些常量值,如:客户所属行业:“教育、医疗、金融…”,客户来源:“网络营销,电话营销”,客户的级别:“普通客户,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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: