前面三篇我们练习了联表的单向操作,接下来我们练习双向的操作
备注:代码还是基于主配置文件
双向一对一
举例:行用卡和账户
- 通过账户我们我们能知道信用卡能透支多少
- 通过信用卡,我们能知道这是哪家开户行的卡
代码实现:
1、工具类:HibernateUtil
public class HibernateUtilEX {
private static Configuration configuration = null;
private static SessionFactory sessionFactory = null;
// 本地化线程、
private static ThreadLocal<Session> localSession = null;
static {
try {
// 加载Hibernate配置文件(默认加载bihernate.cfg.xml)
configuration = new Configuration().configure();
// 获取SessionFactory工厂对象
sessionFactory = configuration.buildSessionFactory();
localSession = new ThreadLocal<Session>();
} catch (Exception e) {
System.out.println("加载hibernate映射文件失败");
e.printStackTrace();
}
}
/**
* 得到Session对象
*
* @return Session
*/
public static Session openSession() throws HibernateException {
// 底层有一个Map<k,V>,K:线程ID,V:session ,一个线程绑定一个session
Session session = localSession.get();
if (session == null) {
session = sessionFactory.openSession();
localSession.set(session);
}
return session;
}
/**
* 关闭Session
*
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = localSession.get();
if (session != null) {
session.close();
}
localSession.set(null);
}
}
2、创建实体类
账户实体类:AccountEntity
public class AccountEntity {
private int id;
private String name;
private CreditCardEntity creditCard; //信用卡关联引用
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 CreditCardEntity getCreditCard() {
return creditCard;
}
public void setCreditCard(CreditCardEntity creditCard) {
this.creditCard = creditCard;
}
@Override
public String toString() {
return "AccountEntity [id=" + id + ", name=" + name + "]";
}
}
账户配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zh.entity">
<class name="AccountEntity" table="t_account">
<!-- 映射标志主键 -->
<id name="id" column="id" type="int">
<!-- 主键生成(自增) -->
<generator class="native"></generator>
</id>
<!-- 映射普通属性 -->
<property name="name" column="name"></property>
<!--关联映射(双向一对一) cascade(级联) unique(唯一约束)-->
<many-to-one name="creditCard" class="CreditCardEntity" column="card_id" cascade="all" unique="true"></many-to-one>
</class>
</hibernate-mapping>
信用卡实体类:CreditCardEntity
public class CreditCardEntity {
private int id;
private String cardId; //卡号
private AccountEntity account; //账户关联
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public AccountEntity getAccount() {
return account;
}
public void setAccount(AccountEntity account) {
this.account = account;
}
@Override
public String toString() {
return "CreditCardEntity [id=" + id + ", cardId=" + cardId + ", account=" + account + "]";
}
}
注:由于是双向,两个类之间的toString,只能一个实现里面的所有属性,不然会造成死循环!
信用卡配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zh.entity">
<class name="CreditCardEntity" table="t_creditCard">
<!-- 映射标志主键 -->
<id name="id" column="id" type="int">
<!-- 主键生成(自增) -->
<generator class="native"></generator>
</id>
<!-- 映射普通属性 -->
<property name="cardId" column="cardId"></property>
<!--关联映射 (property-ref:参考属性) -->
<one-to-one name="account" property-ref="creditCard"></one-to-one>
</class>
</hibernate-mapping>
3、在总配置文件hibernate.cfg.xml里添加配置映射文件
<!-- 双向一对一 -->
<mapping resource="com/zh/entity/AccountEntity.hbm.xml" />
<mapping resource="com/zh/entity/CreditCardEntity.hbm.xml" />
4、创建测试类:HibernateTest
public class HibernateTest {
public static void main(String[] args) {
HibernateTest test = new HibernateTest();
test.doublOneToOne();
}
// 双向一对一
public void doublOneToOne() {
//开启会话
Session session = HibernatUtil.getSession();
//打开事物
Transaction transaction = session.beginTransaction();
/**
* 实例化信用卡类
*/
CreditCardEntity cardEntity = new CreditCardEntity();
cardEntity.setCardId("1111111"); //设置卡号
session.persist(cardEntity); //保存数据
/**
* 实例化账户了
*/
AccountEntity accountEntity = new AccountEntity();
accountEntity.setName("张三"); //用户姓名
accountEntity.setCreditCard(cardEntity); //账户引用卡
cardEntity.setAccount(accountEntity); //卡引用账户
session.persist(accountEntity); //保存数据
transaction.commit(); //提交事物
HibernatUtil.closeSession(session); //关闭会话
}
}
创建成功!