Hibernate(八)多表联查之双向一对一

前面三篇我们练习了联表的单向操作,接下来我们练习双向的操作
备注:代码还是基于主配置文件

双向一对一

举例:行用卡和账户

  • 通过账户我们我们能知道信用卡能透支多少
  • 通过信用卡,我们能知道这是哪家开户行的卡

代码实现:
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);     //关闭会话
    }
}

这里写图片描述
创建成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值