您的位置:首页 > 其它

Hibernate关联关系之一对一(外键关联)

2013-08-04 22:32 363 查看
测试用户类和地址类的一对一关联关系:



User类:

package com.xxc.domain;

public class User {
private Integer id;
private String name;
private Address addr;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Address getAddr() {
return addr;
}

public void setAddr(Address addr) {
this.addr = addr;
}
}


User.hbm.xml:

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.xxc.domain.User" table="users" lazy="false">
<id name="id" column="id" type="integer">
<generator class="identity"></generator>
</id>
<property name="name" column="name" type="string" length="20"/>
<!-- 在外键关联的一方,用多对一模拟一对一,这样的话还不是一对一,这时候要加 unique="true" 表示在多的一方的外键是不能重复的-->
<many-to-one name="addr" class="com.xxc.domain.Address" column="addr" unique="true"/>
</class>
</hibernate-mapping>


Address类:

package com.xxc.domain;

public class Address {
private Integer id;
private String province;
private User user;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getProvince() {
return province;
}

public void setProvince(String province) {
this.province = province;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

}


Address.hbm.xml:

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.xxc.domain.Address" table="address" lazy="false">
<id name="id" column="id" type="integer" >
<generator class="identity"></generator>
</id>
<property name="province" column="province" type="string" length="20"/>
<!-- 属性参考:参考对端的映射addr属性的关联关系的方式 -->
<one-to-one name="user" property-ref="addr"/>
</class>
</hibernate-mapping>


测试类:

package com.xxc.app;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.BeforeClass;
import org.junit.Test;

import com.xxc.domain.Address;
import com.xxc.domain.User;

public class App {
private static SessionFactory sf = null;

@BeforeClass
public static void initialize(){
Configuration config = new Configuration();
/*  也可以写成这样的形式
*	sf = config.addClass(Customer.class).addClass(Order.class).buildSessionFactory();
*/

config.addClass(User.class);
config.addClass(Address.class);
sf = config.buildSessionFactory();

}

@Test
public void insertCustomer(){
Session session = sf.openSession();
Transaction t = session.beginTransaction();

User u = new User();
u.setName("HZ-XXC");

Address a = new Address();
a.setProvince("ZJ");

u.setAddr(a);
u.setAddr(a);
//先保存地址类,因为是用户存在外键,如果先保存用户,那么插入进去的用户数据的外键是null,等到地址数据插入的时候,还要进行一条update外键的操作。
session.save(a);
session.save(u);

t.commit();
session.close();
}

@Test
public void load(){//测试,真否真的是一对一关系。再插入一条id为1的数据
Session session = sf.openSession();
Transaction t = session.beginTransaction();

User u = new User();
u.setName("HKTK");

Address a = (Address) session.load(Address.class, 1);//查询id为1的地址类,并将这个类设置到新创建的User类中
u.setAddr(a);
session.save(u);//会出异常,说Duplicate entry '1' for key 'addr'

t.commit();
session.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: