hibernate一对多与一对一关系映射

一、hibernate多对一关联映射:
关联映射的本质是:
* 将关联关系映射到数据库表,所谓的关联关系是对象模型在内存中的一个或多个引用

<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one>
中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致

<many-to-one>标签的定义示例:
  * <many-to-one name="group" column="groupid"/>
  
理解级联<cascade>的含义?
* 是对象的连锁操作,对增、删、改有作用,而对加载没有作用


二、hibernate一对一关联映射(通过主键关联)----->单向的即从person-->IdCard
一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建
具体映射:
<id name="id">
  <!-- person的主键来源idCard,也就是共享idCard的主键 -->
  <generator class="foreign">
   <param name="property">idCard</param>
  </generator>
</id>
<property name="name"/>
<!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard
  -->
<one-to-one name="idCard" constrained="true"/>


三、hibernate一对一关联映射(通过主键关联)----->双向的即从person<---->IdCard
  需要在idcard映射文件中加入<one-to-one>标签指向person,指示hibernate如何加载person
  默认根据主键加载



四、hibernate一对一唯一外键关联映射(单向关联Person---->IdCard)
一对一唯一外键关联映射是多对一关联映射的特例
可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
通过这种手段映射一对一唯一外键关联


五、hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)
一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载
其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,
所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射方式:
<one-to-one name="person" property-ref="idCard"/>

这里附hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)测试项目的源码:
(注意:采用mysql数据库,所以在引入hibernate3.2中的核心jar包和其他的必须包之外,还要引入mysql的驱动包:mysql-connector-java-3.1.13-bin.jar,这样才能正确链接到mysql数据库)
下面这幅截图是myeclipse中的结构图,展示了所用到的类:

下面这2图是所有的hibernate中需要的jar包(共40个jar包):






第一:exportDB.java源码:
package com.wdh.hibernate;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ExportDB {

public static void main(String[] args) {
  //读取hibernate.cfg.xml文件
  Configuration cfg = new Configuration().configure();
  
  SchemaExport export =  new SchemaExport(cfg);
  export.create(true, true);
}
}

第二:HibernateUtils.java源码:
package com.wdh.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {

private static SessionFactory factory;

static{
  
  try {
   Configuration cfg = new Configuration().configure();
   factory = cfg.buildSessionFactory();
  } catch (Exception e) {
            e.printStackTrace();
  }
  
}

public static SessionFactory getSessionFactory(){
  return factory;
}
public static Session getSession(){
  return factory.openSession();
}
public static void closeSession(Session session){
  if(session != null){
   if(session.isOpen()){
    session.close();
   }
  }
}
}

第三:IdCard.java源码:
package com.wdh.hibernate;
public class IdCard {

private int id;

private String CardNo;

private Person person;
public int getId() {
  return id;
}
public void setId(int id) {
  this.id = id;
}
public String getCardNo() {
  return CardNo;
}
public void setCardNo(String cardNo) {
  CardNo = cardNo;
}
public Person getPerson() {
  return person;
}
public void setPerson(Person person) {
  this.person = person;
}

}

第四:Person.java源码:
package com.wdh.hibernate;
public class Person {

private int id;

private String name;

private IdCard idCard;
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 IdCard getIdCard() {
  return idCard;
}
public void setIdCard(IdCard idCard) {
  this.idCard = idCard;
}
}

第五:IdCard.hbm.xml源码:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="com.wdh.hibernate.IdCard" table="t_idcard">
      <id name="id">
          <generator class="native"/>
      </id>
      <property name="CardNo"/>
      <one-to-one name="person" property-ref="idCard"></one-to-one>
  </class>

</hibernate-mapping>

第六:Person.hbm.xml源码:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="com.wdh.hibernate.Person" table="t_person">
      <id name="id">
          <generator class="native" />
      </id>
      <property name="name"/>
      <many-to-one name="idCard" unique="true"></many-to-one>
  </class>

</hibernate-mapping>

第七:hibernate.cfg.xml源码:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
     <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/hibernate_one2one_ufk_2</property>
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
     <property name="hibernate.connection.username">root</property>
     <property name="hibernate.connection.password">wdh</property>
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
     <property name="hibernate.show_sql">true</property>
    
    
     <mapping resource="com/wdh/hibernate/IdCard.hbm.xml"/>
     <mapping resource="com/wdh/hibernate/Person.hbm.xml"/>
    
</session-factory>
</hibernate-configuration>

第八:One2OneTest.java源码:
package com.wdh.hibernate;
import org.hibernate.Session;
import junit.framework.TestCase;
public class One2OneTest extends TestCase {

    public void testmany2one1(){
  
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
  
  
   IdCard idCard = new IdCard();
   idCard.setCardNo("8888888888888888888");
  
   Person person = new Person();
   person.setName("小沈阳");
   person.setIdCard(idCard);
  
  
   //不能保存成功,因为idCard为transient状态
   session.save(person);
  
  
   session.getTransaction().commit();
  } catch (Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
}
    
    
    
    public void testmany2one2(){
  
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
  
  
   IdCard idCard = new IdCard();
   idCard.setCardNo("8888888888888888888");
   //设置了idCard的save()方法
   session.save(idCard);
  
   Person person = new Person();
   person.setName("小沈阳");
   person.setIdCard(idCard);
  
  
   //现在可以保存成功
   session.save(person);
  
  
   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();
  
   Person person = (Person)session.get(Person.class, 2);
   System.out.println("person.name = " + person.getName());
   System.out.println("person.idCard.CardNo = " + person.getIdCard().getCardNo());
  
  
   session.getTransaction().commit();
  } catch (Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值