component、composite、collection映射

1、component(组件)映射:在hibernate中,component是某个实体的逻辑组成部分,它与实体的根本区别是没有oid,component可以成为是值对象(DDD)

采用component映射的好处:它实现了对象模型的细粒度划分,层次会更分明,复用率会更高
//model
public class Contact {

private String email;

private String address;

private String zipCode;

private String contactTel;

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public String getZipCode() {
return zipCode;
}

public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}

public String getContactTel() {
return contactTel;
}

public void setContactTel(String contactTel) {
this.contactTel = contactTel;
}
}


public class User {

private int id;

private String name;

private Contact contact; // 持有对contact的引用

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Contact getContact() {
return contact;
}

public void setContact(Contact contact) {
this.contact = contact;
}
}
//User.hbm.xml
<hibernate-mapping>
<class name="com.bjsxt.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name" length = "10"/>
<component name="contact"><!-- component映射联系类 -->
<property name="email" length = "10"/>
<property name="address" length = "10"/>
<property name="zipCode" length = "10"/>
<property name="contactTel" length = "10"/>
</component>
</class>
</hibernate-mapping>
//test
import org.hibernate.Session;

import junit.framework.TestCase;

public class ComponentMappingTest extends TestCase {

public void testSave1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();

User user = new User();
user.setName("张三");

Contact contact = new Contact();
contact.setAddress("xxxxx");
contact.setEmail("xx@rr.com");
contact.setZipCode("1111111");
contact.setContactTel("9999999");

user.setContact(contact); //contact不是实体,是一个附属的类

session.save(user); // update、save的对象为实体
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}

2、复合(联合)主键映射:通常将复合主键相关的属性,单独放到一个类中
* 此类必须实现序列化接口
* 覆写hashcode和equals方法
//model
import java.io.Serializable;

@SuppressWarnings("serial")
public class FiscalYearPeriodPK implements Serializable { // 实现序列化接口

//核算年
private int fiscalYear;

//核算月
private int fiscalPeriod;

public int getFiscalYear() {
return fiscalYear;
}

public void setFiscalYear(int fiscalYear) {
this.fiscalYear = fiscalYear;
}

public int getFiscalPeriod() {
return fiscalPeriod;
}

public void setFiscalPeriod(int fiscalPeriod) {
this.fiscalPeriod = fiscalPeriod;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + fiscalPeriod;
result = prime * result + fiscalYear;
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final FiscalYearPeriodPK other = (FiscalYearPeriodPK) obj;
if (fiscalPeriod != other.fiscalPeriod)
return false;
if (fiscalYear != other.fiscalYear)
return false;
return true;
}
}


import java.util.Date;

/**
* 核算期间
* @author wangy
*
*/
public class FiscalYearPeriod {

private FiscalYearPeriodPK fiscalYearPeriodPK;

//开始日期
private Date beginDate;

//结束日期
private Date endDate;

//状态
private String periodSts;

public Date getBeginDate() {
return beginDate;
}

public void setBeginDate(Date beginDate) {
this.beginDate = beginDate;
}

public Date getEndDate() {
return endDate;
}

public void setEndDate(Date endDate) {
this.endDate = endDate;
}

public String getPeriodSts() {
return periodSts;
}

public void setPeriodSts(String periodSts) {
this.periodSts = periodSts;
}

public FiscalYearPeriodPK getFiscalYearPeriodPK() {
return fiscalYearPeriodPK;
}

public void setFiscalYearPeriodPK(FiscalYearPeriodPK fiscalYearPeriodPK) {
this.fiscalYearPeriodPK = fiscalYearPeriodPK;
}
}
//FiscalYearPeriod.hbm.xml
<hibernate-mapping>
<class name="com.bjsxt.hibernate.FiscalYearPeriod" table="t_fiscal_year_period">
<composite-id name="fiscalYearPeriodPK"><!-- 映射联合主键 -->
<key-property name="fiscalYear"/>
<key-property name="fiscalPeriod"/>
</composite-id>
<property name="beginDate"/>
<property name="endDate"/>
<property name="periodSts"/>
</class>
</hibernate-mapping>
//test
import java.util.Date;

import org.hibernate.Session;

import junit.framework.TestCase;

public class CompositeMappingTest extends TestCase {

public void testSave1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();

FiscalYearPeriod fiscalYearPeriod = new FiscalYearPeriod();// 实体类

FiscalYearPeriodPK pk = new FiscalYearPeriodPK(); // 主键附属类
pk.setFiscalYear(2008);
pk.setFiscalPeriod(8);

fiscalYearPeriod.setFiscalYearPeriodPK(pk);

fiscalYearPeriod.setBeginDate(new Date());
fiscalYearPeriod.setEndDate(new Date());
fiscalYearPeriod.setPeriodSts("Y");

session.save(fiscalYearPeriod);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}

public void testLoad1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();

FiscalYearPeriodPK pk = new FiscalYearPeriodPK();
pk.setFiscalYear(2008);
pk.setFiscalPeriod(8);

// 根据主键加载实体类
FiscalYearPeriod fiscalYearPeriod = (FiscalYearPeriod)session.load(FiscalYearPeriod.class, pk);

System.out.println(fiscalYearPeriod.getPeriodSts());

session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}

3、set、list、array、map
//model
import java.util.List;
import java.util.Map;
import java.util.Set;

public class CollectionMapping {

private int id;

private String name;

private Set<String> setValue;

private List<String> listValue;

private String[] arrayValue;

private Map<String, String> mapValue;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String[] getArrayValue() {
return arrayValue;
}

public void setArrayValue(String[] arrayValue) {
this.arrayValue = arrayValue;
}

public void setListValue(List<String> listValue) {
this.listValue = listValue;
}

public List<String> getListValue() {
return listValue;
}

public void setSetValue(Set<String> setValue) {
this.setValue = setValue;
}

public Set<String> getSetValue() {
return setValue;
}

public void setMapValue(Map<String, String> mapValue) {
this.mapValue = mapValue;
}

public Map<String, String> getMapValue() {
return mapValue;
}
}
//CollectionMapping.hbm.xml
<hibernate-mapping>
<class name="com.bjsxt.hibernate.CollectionMapping" table="t_CollectionMapping">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="setValue" table="t_set_value"><!-- 映射集合Set,将CollectionMapping普通属性setValue映射成表 -->
<key column="set_id"/><!-- 增加字段set_id,作为外键指向t_CollectionMapping -->
<element type="string" column="set_value"/><!-- t_set_value表中保存集合Set的值 -->
</set>
<list name="listValue" table="t_list_value"><!-- List集合有顺序 -->
<key column="list_id"/>
<list-index column="list_index"/><!-- 加入索引,用于保证顺序 -->
<element type="string" column="list_value"/>
</list>
<array name="arrayValue" table="t_array_value"><!-- 数组有顺序 -->
<key column="array_id"/>
<list-index column="array_index"/>
<element type="string" column="array_value"/>
</array>
<map name="mapValue" table="t_map_value">
<key column="map_id"/>
<map-key type="string" column="map_key"/><!-- key-value -->
<element type="string" column="map_value"/>
</map>
</class>
</hibernate-mapping>
//test
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Session;

import junit.framework.TestCase;

public class CollectionMappintTest extends TestCase {

public void testSave1() {
CollectionMapping c = new CollectionMapping();

c.setName("xxx");

Set<String> setValue = new HashSet<String>();
setValue.add("a");
setValue.add("b");
c.setSetValue(setValue);

List<String> listValue = new ArrayList<String>();
listValue.add("c");
listValue.add("d");
c.setListValue(listValue);

String[] arrayValue = new String[]{"e", "f"};
c.setArrayValue(arrayValue);

Map<String, String> mapValue = new HashMap<String, String>();
mapValue.put("k1", "v1");
mapValue.put("k2", "v2");
c.setMapValue(mapValue);

Session session = null;
try { // 一般只需要包含会出异常代码
session = HibernateUtils.getSession();
session.beginTransaction();

session.save(c);

session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}

public void testLoad1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();

//根据主键加载实体类
CollectionMapping c = (CollectionMapping)session.load(CollectionMapping.class, 1);
System.out.println("name=" + c.getName());
System.out.println("setvalue=" + c.getSetValue());
System.out.println("mapvalue=" + c.getMapValue());
System.out.println("listvalue=" + c.getListValue());
System.out.println("arrayValue=" + c.getArrayValue().length);

session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值