`
xfxlch
  • 浏览: 162585 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate 一对一关系(基于XML)

阅读更多
场景: 当一个实体跟另一个实体存在一对一关系时,就可以用hibernate的one-to-one mapping来处理啦。

本教程将会讲解如何用hibernate来解决两个存在1对1关联关系的表之间的级联save问题。

本教程用到的开发工具和技术:
1. Hibernate 3.6.3.Final
2. Oracle 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
3. Apache Maven 3.3.3
4. Eclipse Mars Release (4.5.0)

项目结构:



项目依赖:
pom.xml 文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.luchenghao.common</groupId>
	<artifactId>HibernateExamples</artifactId>
	<packaging>jar</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>HibernateExamples</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>3.6.3.Final</version>
		</dependency>

		<dependency>
			<groupId>javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.12.1.GA</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/log4j/log4j -->
		<dependency>
		    <groupId>log4j</groupId>
		    <artifactId>log4j</artifactId>
		    <version>1.2.17</version>
		</dependency>

		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>11.2.0</version>
		</dependency>
		
	</dependencies>
</project>




1. “One-to-one” 表关联
一对一关系的表设计是指,一个STOCK表中有且仅有一条STOCK_DETAIL记录与其对应, 两个表中都有同样的STOCK_ID作为主健,在STOCK_DETAIL表中STOCK_ID既是主健,同时也作为外键关联到STOCK表的STOCK_ID字段。这就是常见的一对一的表结构设计。



建表语句:
CREATE TABLE "CLUDBA"."STOCK" (
  "STOCK_ID" NUMBER NOT NULL ENABLE,
  "STOCK_CODE" VARCHAR2(10 BYTE) NOT NULL ENABLE,
  "STOCK_NAME" VARCHAR2(20 BYTE ) NOT NULL ENABLE,
  CONSTRAINT "STOCK_PK" PRIMARY KEY ("STOCK_ID")
);

--
-- Definition of table "stock_detail"
--
CREATE TABLE  "CLUDBA"."STOCK_DETAIL" (
  "STOCK_ID" NUMBER(10)  NOT NULL ,
  "COMP_NAME" VARCHAR2(100) NOT NULL,
  "COMP_DESC" VARCHAR2(255) DEFAULT NULL,
  "REMARK" VARCHAR2(255) DEFAULT NULL,
  "LISTED_DATE" date NOT NULL,
  PRIMARY KEY ("STOCK_ID"),
  CONSTRAINT "FK_STOCK_ID" FOREIGN KEY ("STOCK_ID") REFERENCES "STOCK" ("STOCK_ID")
);



2. Hibernate的model类
创建两个entity类来对应上面的两张表,分别是Stock.java 和StockDetail.java.
Stock.java 文件:
public class Stock {
	private Integer stockId;
	private String stockCode;
	private String stockName;
	private StockDetail stockDetail;
        //getter和setter
}


StockDetail.java
public class StockDetail {

	private Integer stockId;
	private Stock stock;
	private String compName;
	private String compDesc;
	private String remark;
	private Date listedDate;
        //getter和setter
}


3. Hibernate的mapping文件
创建两个对应的hbm文件,Stock.hbm.xml和StockDetail.hbm.xml

Stock.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">
<!-- Generated 25 April 2011 7:52:33 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
	<class name="com.luchenghao.domain.Stock" table="STOCK">
		<id name="stockId" type="java.lang.Integer">
			<column name="STOCK_ID" />
			<generator class="increment" />
		</id>
		<property name="stockCode" type="string">
			<column name="STOCK_CODE" length="10" not-null="true" unique="true" />
		</property>
		<property name="stockName" type="string">
			<column name="STOCK_NAME" length="20" not-null="true" unique="true" />
		</property>
		<one-to-one name="stockDetail" class="com.luchenghao.domain.StockDetail"
			cascade="save-update"></one-to-one>

	</class>
</hibernate-mapping>



StockDetail.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">
<!-- Generated 25 April 2011 7:52:33 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
	<class name="com.luchenghao.domain.StockDetail" table="STOCK_DETAIL">
		<id name="stockId" type="java.lang.Integer">
			<column name="STOCK_ID" />
			<generator class="foreign">
				<param name="property">stock</param>
			</generator>
		</id>
		<one-to-one name="stock" class="com.luchenghao.domain.Stock"
			constrained="true"></one-to-one>
			
		<property name="compName" type="string">
			<column name="COMP_NAME" length="100" not-null="true" />
		</property>
		<property name="compDesc" type="string">
			<column name="COMP_DESC" not-null="true" />
		</property>
		<property name="remark" type="string">
			<column name="REMARK" not-null="true" />
		</property>
		<property name="listedDate" type="date">
			<column name="LISTED_DATE" length="10" not-null="true" />
		</property>
	</class>
</hibernate-mapping>


PS:由于STOCK_DETAIL的的主键和STOCK表示一样的,所以在StockDetail.hbm.xml文件中通过指定generator=foreign来实现表明Stock_detail的主键的由来,并通过指定constrained="true"来限制Stock表的主健一定要存在。

4. Hibernate 的配置文件
将Stock.hbm.xml和StockDetail.hbm.xml配置到Hibernate.cfg.xml文件中。
Hibernate.cfg.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<!-- a SessionFactory instance listed as /jndi/name -->
	<session-factory>
		<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
		<property name="hibernate.connection.url">jdbc:oracle:thin:@hz2dw3207:1521:O07CAB</property>
		<property name="hibernate.connection.username">RMMDBA</property>
		<property name="hibernate.connection.password">RMMDBA</property>
		<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
		<property name="hibernate.default_schema">RMMDBA</property>
		<property name="show_sql">true</property>
		
		<mapping resource="com/luchenghao/domain/Stock.hbm.xml"></mapping>
		<mapping resource="com/luchenghao/domain/StockDetail.hbm.xml"></mapping>
	</session-factory>

</hibernate-configuration>


5. 运行

package com.luchenghao.common;

import java.util.Date;

import org.hibernate.Session;

import com.luchenghao.domain.Stock;
import com.luchenghao.domain.StockDetail;
import com.luchenghao.util.HibernateUtil;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println("Maven + Hibernate One-to-One example + Oracle");
		Session session = HibernateUtil.getSessionFactory().openSession();

		session.beginTransaction();

		Stock stock = new Stock();

		stock.setStockCode("4715");
		stock.setStockName("GENM");

		StockDetail stockDetail = new StockDetail();
		stockDetail.setCompName("GENTING Malaysia");
		stockDetail.setCompDesc("Best resort in the world");
		stockDetail.setRemark("Nothing Special");
		stockDetail.setListedDate(new Date());

		stock.setStockDetail(stockDetail);
		stockDetail.setStock(stock);

		session.save(stock);
		session.getTransaction().commit();

		System.out.println("Done");
    }
}




输出结果:

引用

Maven + Hibernate One-to-One example + Oracle
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hibernate: select max(STOCK_ID) from RMMDBA.STOCK
Hibernate: insert into RMMDBA.STOCK (STOCK_CODE, STOCK_NAME, STOCK_ID) values (?, ?, ?)
Hibernate: insert into RMMDBA.STOCK_DETAIL (COMP_NAME, COMP_DESC, REMARK, LISTED_DATE, STOCK_ID) values (?, ?, ?, ?, ?)
Done



项目下载链接:
http://dl.iteye.com/topics/download/f244e58d-a147-36c5-a23f-4a0cd32c79b0
  • 大小: 10.1 KB
  • 大小: 8.7 KB
分享到:
评论

相关推荐

    Hibernate1对多1对1多对多关联映射例子源码含xml配置

    在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,这个是xml配置的例子

    Hibernate1对多1对1多对多关联映射例子源码含注解配置

    在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用...

    Hibernate Annotations 中文文档

    一对一(One-to-one) 2.2.5.2. 多对一(Many-to-one) 2.2.5.3. 集合类型 2.2.5.4. 用cascading实现传播性持久化(Transitive persistence) 2.2.5.5. 关联关系获取 2.2.6. 映射复合主键与外键 2.2.7. 映射二级表...

    Spring hibernate SpringMVC整合对数据库操作

    Hibernate是一款优秀的ORM框架,能够连接并操作数据库,包括保存和修改数据。Spring MVC是Java的web框架,能够将Hibernate集成进去,完成数据的CRUD。Hibernate使用方便,配置响应的XML文件即可。由于spring3.x,基于...

    hibernate annotation 中文文档

    一对一(One-to-one) 2.2.5.2. 多对一(Many-to-one) 2.2.5.3. 集合类型 2.2.5.4. 用cascading实现传播性持久化(Transitive persistence) 2.2.5.5. 关联关系获取 2.2.6. 映射复合主键与外键 2.2.7. 映射二级表...

    spring hibernate,spring jdbc事务管理

    两个项目,一个项目是基于spring jdbc实现的分布式事务,一个是基于spring hibernate的分布式事务,hibernate项目里的applicationContext2.xml是基于mysql和mssql, applicationContext3.xml基于两个mssql, ...

    最全Hibernate 参考文档

    7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多...

    Hibernate教程

    8.2.2. 一对一(one to one) 8.2.3. 一对多(one to many) 8.3. 使用连接表的单向关联(Unidirectional associations with join tables) 8.3.1. 一对多(one to many) 8.3.2. 多对一(many to one) 8.3.3. 一...

    深入浅出Hibernate源码

    (假若您希望使用其它用户名如root,您需要修改hibernate的数据库配置中的连接参数——位于hibernate.cfg.xml中,以及创建数据库表时的连接参数——位于build.xml中。) 7, 确认ant安装正确. ant可以在此下载: ...

    基于EasyUI的JSP和Hibernate改进的页面设计源码

    本项目是基于EasyUI改进的...该项目对上一个项目进行了页面改进,使用了EasyUI框架来提升用户体验和界面美观。项目结构清晰,代码注释详尽,适合用于学习和研究Java、JSP、Hibernate以及EasyUI在Web应用开发中的应用。

    hibernate 教程

    一对一 5.1.12. 组件(component), 动态组件(dynamic-component) 5.1.13. 子类(subclass) 5.1.14. 连接的子类(joined-subclass) 5.1.15. map, set, list, bag 5.1.16. 引用(import) 5.2. ...

    Hibernate数据持久层框架.rar

    是一款持久层框架,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA的对象关系映射(ORM)模型是基于Hibernate。是一款面向对象的ORM框架,JPA不...

    Hibernate实战(第2版 中文高清版)

     7.1.2 一对一的外键关联   7.1.3 用联结表映射   7.2 多值的实体关联   7.2.1 一对多关联   7.2.2 多对多关联   7.2.3 把列添加到联结表   7.2.4 映射map   7.3 多态关联   7.3.1 多态的多对一...

    Hibernate使用技巧汇总

    property-ref:关联类中用于与主控类相关联的属性名,默认为关联类的主键属性名 单向一对多需在一方配置,双向一对多需在双方进行配置 8.lazy=false:被动方的记录由hibernate负责记取,之后存放在主控...

    基于Spring MVC、CXF和Hibernate的Web服务与数据库操作设计源码

    本源码提供了一个基于Spring MVC、CXF和Hibernate的Web服务与数据库操作设计。项目包含53个文件,其中包括15个XML文件、13个Java源文件、10个属性文件、3个YAML文件、3个JSP页面、2个MF文件、1个Gitignore文件、1个...

    Hibernate3+中文参考文档

    7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向关联(Bidirectional associations) 7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的...

    hibernate3.04中文文档.chm

    8.4.2. 一对一(one to one) 8.5. 使用连接表的双向关联(Bidirectional associations with join tables) 8.5.1. 一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多...

    基于SpringMVC+Hibernate4的考勤管理系统+.zip

    基于SpringMVC+Hibernate4的考勤管理系统+.zip 项目环境 系统:Windows7 X64位系统 IDE:Intellij IDEA 14.0 后端技术选型 J D K 版 本:JDK 1.8 数 据 库:Mysql 5.7 WEB容器:Tomcat 7.0 视图框架:SpringMVC 4.3.6....

    XML解析教程

    JDOM(注意JDOM决不是DOM扩展,虽然名字差不多,但两者平行的关系 )是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM的目的是成为Java特定文档模型,它简化与XML...

Global site tag (gtag.js) - Google Analytics