场景: 当一个实体跟另一个实体存在一对一关系时,就可以用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版)”的主题中,我们将深入探讨如何通过XML配置文件实现两个实体之间的一对一关系。 首先,我们需要理解一对一关联的概念。在数据库中,一对一关联意味着两个表中的每一...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联查询是一种常见的关系映射方式,用于表示两个实体之间一对一的依赖关系。这种关联通常在数据库中通过外键或者主键来实现。本文将深入探讨基于外键的一对一...
这个demo演示了如何在Hibernate中建立和管理一对一关系,包括注解配置、XML配置以及相关的CRUD操作。理解并熟练掌握这些知识对于进行基于Hibernate的Java开发至关重要。在实际项目中,根据业务需求合理设计实体关系...
Hibernate是一个开源的Java框架,主要用于简化企业级应用中的对象关系映射(Object-Relational Mapping,ORM)。它允许开发者将数据库操作转换为对Java对象的操作,从而降低了开发人员处理SQL和JDBC的复杂度,提高了...
这个文件名暗示了这是一组基于Spring、Struts和Hibernate(简称S2SH)的示例代码,具体涉及的是关系映射中的一对一单向外键关联。"uni_fk"表示单向(unidirectional)外键(foreign key)关联。在数据库中,外键用于...
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,这个是xml配置的例子
在Java的持久化框架Hibernate中,一对多(Many-to-One)和多对一(One-to-Many)的关系映射是数据库关系模型中的常见关联类型。本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和...
这个文件名可能代表了一个基于Struts2、Spring和Hibernate(S2SH)的项目,其中"relation03"可能表示关系映射的第三部分,而"one2one_uni_pk"直指一对一单向主键关联的具体实现。 **详细知识点:** 1. **一对一...
8. 基于XML的查询:Hibernate允许使用HQL(Hibernate Query Language)或Criteria API进行查询,它还支持查询XML文件中的数据,这在某些特定的业务场景下可能非常有用。 9. Hibernate的配置和管理:需要对Hibernate...
对于不使用注解的旧版Hibernate,我们需要在XML映射文件中配置一对一关系。 ```xml <!-- User.hbm.xml --> ... ... <!-- Account.hbm.xml --> ... ... ``` 三、双向关联的注意事项 1. **...
在一对一或多对一的关联中,`mappedBy`属性应该放在拥有外键的一方,表示由这一方来维护关系。例如,在上述的User和Order例子中,`@OneToMany(mappedBy = "user")`应该放在User类的orders属性上。 最后,当我们使用...
Spring提供了`LocalSessionFactoryBean`用于配置基于XML的Hibernate映射,而`AnnotationSessionFactoryBean`则用于处理基于注解的映射。这两个类分别处理不同的映射方式,所以默认情况下,它们不能直接共存于同一个...
该项目是一个基于Hibernate3框架的CRUD设计源码,涵盖32个文件,包括14个Java源文件、9个XML配置文件...它实现了包括一对一、一对多、多对一、多对多关系在内的复杂关系关联,适用于需要处理多种实体间关系的应用场景。
标题 "Hibernate基于连接表的一对多单向关联" 涉及的是数据库对象关系映射(ORM)框架Hibernate中的一个重要概念。在Java开发中,Hibernate是广泛使用的工具,它允许开发者将Java类与数据库表进行映射,简化了数据...
- `<one-to-many class="limq.hibernate.vo.History">`表示`Students`实体与`History`实体之间是一对多关系。 **6. 多对一关系映射:** - 反过来,在`History`实体类中可以定义一个多对一的关系。 - 示例代码中...
首先,JDOM是Java Document Object Model的简称,它是一个为Java设计的XML API,提供了对XML文档的全面处理能力,包括创建、修改和读取XML文档。JDOM的优点在于它的API完全基于Java,使得开发者可以更加直观地理解和...
6. **多对一、一对多、多对多关联**:Hibernate支持各种关系映射,包括一对一、一对多、多对一和多对多的关联映射,便于处理复杂的数据库关系。 7. **级联操作**:级联属性允许将一个实体的操作(如保存、删除)...
“Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...
总结,基于Struts和Hibernate的论坛系统是Java Web开发中一个典型的实例,它充分展示了这两种框架的协同工作能力,为开发者提供了高效、可扩展的平台,使得构建大型的、功能丰富的论坛应用成为可能。