一、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);
}
}
}
hibernate一对多与一对一关系映射
最新推荐文章于 2019-04-16 20:42:10 发布