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(); } }