`
xfxlch
  • 浏览: 167446 次
  • 性别: 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
分享到:
评论

相关推荐

    Hibernate双向一对一关联映射(XML版)

    在这个“Hibernate双向一对一关联映射(XML版)”的主题中,我们将深入探讨如何通过XML配置文件实现两个实体之间的一对一关系。 首先,我们需要理解一对一关联的概念。在数据库中,一对一关联意味着两个表中的每一...

    Hibernate 一对一关联查询.docx

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联查询是一种常见的关系映射方式,用于表示两个实体之间一对一的依赖关系。这种关联通常在数据库中通过外键或者主键来实现。本文将深入探讨基于外键的一对一...

    hibernate单边一对一关系demo

    这个demo演示了如何在Hibernate中建立和管理一对一关系,包括注解配置、XML配置以及相关的CRUD操作。理解并熟练掌握这些知识对于进行基于Hibernate的Java开发至关重要。在实际项目中,根据业务需求合理设计实体关系...

    基于hibernate的简单留言本

    Hibernate是一个开源的Java框架,主要用于简化企业级应用中的对象关系映射(Object-Relational Mapping,ORM)。它允许开发者将数据库操作转换为对Java对象的操作,从而降低了开发人员处理SQL和JDBC的复杂度,提高了...

    Hibernate教程04_关系映射之一对一单向外键关联

    这个文件名暗示了这是一组基于Spring、Struts和Hibernate(简称S2SH)的示例代码,具体涉及的是关系映射中的一对一单向外键关联。"uni_fk"表示单向(unidirectional)外键(foreign key)关联。在数据库中,外键用于...

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

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

    Hibernate一对多(多对一)双向关联(annotation/xml)

    在Java的持久化框架Hibernate中,一对多(Many-to-One)和多对一(One-to-Many)的关系映射是数据库关系模型中的常见关联类型。本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和...

    Hibernate教程06_关系映射之一对一单向主键关联

    这个文件名可能代表了一个基于Struts2、Spring和Hibernate(S2SH)的项目,其中"relation03"可能表示关系映射的第三部分,而"one2one_uni_pk"直指一对一单向主键关联的具体实现。 **详细知识点:** 1. **一对一...

    基于Hibernate的XML数据存储方法.pdf

    8. 基于XML的查询:Hibernate允许使用HQL(Hibernate Query Language)或Criteria API进行查询,它还支持查询XML文件中的数据,这在某些特定的业务场景下可能非常有用。 9. Hibernate的配置和管理:需要对Hibernate...

    hibernate一对一主键关联映射(双项关联)

    对于不使用注解的旧版Hibernate,我们需要在XML映射文件中配置一对一关系。 ```xml &lt;!-- User.hbm.xml --&gt; ... ... &lt;!-- Account.hbm.xml --&gt; ... ... ``` 三、双向关联的注意事项 1. **...

    hibernate基于主外键的一对多/多对一关联

    在一对一或多对一的关联中,`mappedBy`属性应该放在拥有外键的一方,表示由这一方来维护关系。例如,在上述的User和Order例子中,`@OneToMany(mappedBy = "user")`应该放在User类的orders属性上。 最后,当我们使用...

    让Hibernate同时支持xml和注解两种映射方式

    Spring提供了`LocalSessionFactoryBean`用于配置基于XML的Hibernate映射,而`AnnotationSessionFactoryBean`则用于处理基于注解的映射。这两个类分别处理不同的映射方式,所以默认情况下,它们不能直接共存于同一个...

    基于Hibernate3框架的一对一、一对多、多对一、多对多关系关联CRUD设计源码

    该项目是一个基于Hibernate3框架的CRUD设计源码,涵盖32个文件,包括14个Java源文件、9个XML配置文件...它实现了包括一对一、一对多、多对一、多对多关系在内的复杂关系关联,适用于需要处理多种实体间关系的应用场景。

    Hibernate基于连接表的一对多单向关联

    标题 "Hibernate基于连接表的一对多单向关联" 涉及的是数据库对象关系映射(ORM)框架Hibernate中的一个重要概念。在Java开发中,Hibernate是广泛使用的工具,它允许开发者将Java类与数据库表进行映射,简化了数据...

    Hibernate留言板

    - `&lt;one-to-many class="limq.hibernate.vo.History"&gt;`表示`Students`实体与`History`实体之间是一对多关系。 **6. 多对一关系映射:** - 反过来,在`History`实体类中可以定义一个多对一的关系。 - 示例代码中...

    Jdom生成hibernate.cfg.xml和读取其中内容

    首先,JDOM是Java Document Object Model的简称,它是一个为Java设计的XML API,提供了对XML文档的全面处理能力,包括创建、修改和读取XML文档。JDOM的优点在于它的API完全基于Java,使得开发者可以更加直观地理解和...

    Hibernate 符合JAVA习惯的关系数据库持久化.pdf

    6. **多对一、一对多、多对多关联**:Hibernate支持各种关系映射,包括一对一、一对多、多对一和多对多的关联映射,便于处理复杂的数据库关系。 7. **级联操作**:级联属性允许将一个实体的操作(如保存、删除)...

    Hibernate基于外键的一对多单向关联

    “Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...

    基于Struts+Hibernate论坛系统

    总结,基于Struts和Hibernate的论坛系统是Java Web开发中一个典型的实例,它充分展示了这两种框架的协同工作能力,为开发者提供了高效、可扩展的平台,使得构建大型的、功能丰富的论坛应用成为可能。

Global site tag (gtag.js) - Google Analytics