测试用户类和地址类的一对一关联关系(主键关联):
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_pk" lazy="false">
<id name="id" column="id" type="integer">
<generator class="identity"></generator>
</id>
<property name="name" column="name" type="string" length="20"/>
<one-to-one name="addr" class="com.xxc.domain.Address"/><!-- 设置User类一对一关联 -->
</class>
</hibernate-mapping>
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_pk" lazy="false">
<id name="id" column="id" type="integer" >
<!-- 从外部属性中提取ID值,作为Address的ID值,这里提取的是Address类中User属性 -->
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<property name="province" column="province" type="string" length="20"/>
<!-- constrained表示受到约束:1.不能为null 2.id必须有值 -->
<one-to-one name="user" class="com.xxc.domain.User" constrained="true"/>
</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);
a.setUser(u);
//先保存地址类,因为是用户存在外键,如果先保存用户,那么插入进去的用户数据的外键是null,等到地址数据插入的时候,还要进行一条update外键的操作。
session.save(u);
session.save(a);
t.commit();
session.close();
}
@Test
public void load(){//测试,真否真的是一对一关系。再插入一条id为1的数据
Session session = sf.openSession();
Transaction t = session.beginTransaction();
Address a = new Address();
a.setProvince("BJ");
User u = (User) session.load(User.class, 6);
u.setAddr(a);
a.setUser(u);
session.save(a);
t.commit();
session.close();
}
}