hibernate一对一单向外键关联
一、场景
我国实行一夫一妻制,一个Husband对应一个Wife,其中Wife为主控方(悲剧啊),即wife是属于one的一方
二、R
CREATE TABLE `wife` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
CREATE TABLE `husband` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`wifeid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_wife` (`wifeid`),
CONSTRAINT `fk_wife` FOREIGN KEY (`wifeid`) REFERENCES `wife` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8
三、O
Wife
package com.linys.model;
/**
* Wife entity. @author MyEclipse Persistence Tools
*/
public class Wife implements java.io.Serializable {
// Fields
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
// Constructors
/** default constructor */
public Wife() {
}
/** minimal constructor */
public Wife(String name) {
this.name = name;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
Husband
package com.linys.model;
/**
* Husband entity. @author MyEclipse Persistence Tools
*/
public class Husband implements java.io.Serializable {
// Fields
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private Wife wife;
private String name;
// Constructors
/** default constructor */
public Husband() {
}
/** minimal constructor */
public Husband(String name) {
this.name = name;
}
/** full constructor */
public Husband(Wife wife, String name) {
this.wife = wife;
this.name = name;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public Wife getWife() {
return this.wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
四、映射文件
Wife.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.linys.model.Wife" table="wife">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="50" not-null="true" />
</property>
</class>
</hibernate-mapping>
Husband.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.linys.model.Husband" table="husband">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="50" not-null="true" />
</property>
<many-to-one name="wife" class="com.linys.model.Wife" unique="true" >
<column name="wifeid" />
</many-to-one>
</class>
</hibernate-mapping>
其中:
<many-to-one:one-to-one是many-to-one的特殊一种,只是将unique 设置成true即可
many-to-one可以看做是foreign key字段的映射,
五、测试程序
package com.linys.model;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestOne2OneUniFK {
static SessionFactory sf;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
sf = new Configuration().configure().buildSessionFactory();
}
@Test
public void testOne2OneUniFK(){
Wife wife=new Wife();
wife.setName("wife");
Husband husband=new Husband();
husband.setName("husband");
husband.setWife(wife);
Session session=sf.openSession();
Transaction ts=session.beginTransaction();
//插入可以
// session.save(wife);
// session.save(husband);
//插入可以
// session.save(husband);
// session.save(wife);
//插入不行
// session.save(husband);
//插入可以
session.save(wife);
ts.commit();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
sf.close();
}
}
本文介绍了一对一单向外键关联的实现方法,通过创建 Husband 和 Wife 两个表,并在 Husband 表中添加 Wife 的外键来实现关联。文章详细展示了数据库表结构、Java 实体类定义及 Hibernate 映射文件。

1547

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



