当一个实体与另一实体中的一个事件恰好相关时,就会发生一对一的关系。
在本教程中,我们向您展示如何通过XML映射文件(hbm)在Hibernate中处理一对一的表关系。
本教程中使用的工具和技术:
- 休眠3.6.3。最终
- MySQL 5.1.15
- Maven的3.0.3
- Eclipse 3.6
项目结构
请参阅本教程的最终项目结构。
项目依赖
从JBoss存储库获取hibernate.jar ,Maven将为您处理所有相关的依赖项。
档案:pom.xml
<project ...>
<repositories>
<repository>
<id>JBoss repository</id>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<!-- MySQL database driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.15</version>
</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>
</dependencies>
</project>
1.“一对一”表关系
一个一比一的关系表的设计,A股表包含STOCK_DETAIL表一个记录。 两个表都具有与主键相同的Stock_Id。 在STOCK_DETAIL表中,Stock_Id是主键,也是STOCK表的外键。 这是定义“一对一”表关系的常用方法。
要获取STOCK和STOCK_DETAIL表脚本,请参阅此“ MySQL中的一对一表关系 ”文章。
2.休眠模型类
创建两个模型类– Stock.java和StockDetail.java ,以表示上述表。
文件:Stock.java
package com.mkyong.stock;
public class Stock implements java.io.Serializable {
private Integer stockId;
private String stockCode;
private String stockName;
private StockDetail stockDetail;
//constructor & getter and setter methods
}
文件:StockDetail.java
package com.mkyong.stock;
public class StockDetail implements java.io.Serializable {
private Integer stockId;
private Stock stock;
private String compName;
private String compDesc;
private String remark;
private Date listedDate;
//constructor & getter and setter methods
}
3. Hibernate XML映射
现在,创建两个Hibernate映射文件(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.mkyong.stock.Stock" table="stock" catalog="mkyongdb">
<id name="stockId" type="java.lang.Integer">
<column name="STOCK_ID" />
<generator class="identity" />
</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.mkyong.stock.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.mkyong.stock.StockDetail" table="stock_detail"
catalog="mkyongdb">
<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.mkyong.stock.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>
注意
一对一关系的主要困难是确保为两者分配相同的主键。 在StockDetail.hbm.xml中,声明了一个特殊的外部标识符生成器 ,它将知道从STOCK表中获取主键值。 如果使用constrained =“ true”,则可以确保库存必须存在。
4.休眠配置文件
将Stock.hbm.xml和StockDetail.hbm.xml以及Hibernate配置文件放入Hibernate配置文件中。
档案:hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyongdb</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<mapping resource="com/mkyong/stock/Stock.hbm.xml" />
<mapping resource="com/mkyong/stock/StockDetail.hbm.xml" />
</session-factory>
</hibernate-configuration>
5.运行
运行它,Hibernate将在STOCK表中插入一行,并在STOCK_DETAIL表中插入一行。
档案:App.java
package com.mkyong;
import java.util.Date;
import org.hibernate.Session;
import com.mkyong.stock.Stock;
import com.mkyong.stock.StockDetail;
import com.mkyong.util.HibernateUtil;
public class App {
public static void main(String[] args) {
System.out.println("Hibernate one to one (XML mapping)");
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");
}
}
输出量
Hibernate one to one (XML mapping)
Hibernate: insert into mkyongdb.stock (STOCK_CODE, STOCK_NAME) values (?, ?)
Hibernate: insert into mkyongdb.stock_detail
(COMP_NAME, COMP_DESC, REMARK, LISTED_DATE, STOCK_ID) values (?, ?, ?, ?, ?)
Done
休眠注释
有关Hibernate批注中的一对一,请参考此示例
下载它– Hibernate-one-to-one-xml-mapping.zip (10KB)
参考
翻译自: https://mkyong.com/hibernate/hibernate-one-to-one-relationship-example/
本文介绍了一对一关系在Hibernate中的实现方法,通过XML映射文件处理一对一双向关系,包括项目设置、实体类创建、映射文件配置及运行示例。
&spm=1001.2101.3001.5002&articleId=106554385&d=1&t=3&u=5c31d7c1067a409281650c97480ef3e8)
191

被折叠的 条评论
为什么被折叠?



