public class Person {
private Integer id;
private String name;
private int age;
private Address address;
//************************************系统自动创建区**************************************
public Person(){}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
主类的配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate?Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="relevance">
<class name="Person" table="relevance" dynamic-update="true">
<id name="id">
<generator class="native"></generator></id>
<property name="name"/>
<property name="age"/>
<one-to-one name="address"></one-to-one>
</class>
</hibernate-mapping>
public class Address {
private Integer id;
private String city;
private int postcode;
private Person person;
//************************************系统自动创建区**************************************
public Address(){}
public Address(String city, int postcode) {
super();
this.city = city;
this.postcode = postcode;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getPostcode() {
return postcode;
}
public void setPostcode(int postcode) {
this.postcode = postcode;
}
@Override
public String toString() {
return "Address [id=" + id + ", city=" + city + ", postcode=" + postcode + "]";
}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate?Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="relevance">
<class name="Address" table="relevance_address" dynamic-update="true">
<id name="id">
<generator class="native"></generator></id>
<property name="city"/>
<property name="postcode"/>
<many-to-one name="person" column="person_id" unique="true" not-null="true"></many-to-one>
</class>
</hibernate-mapping>
如果改为关联是foreign key one 2 one 的设置则只需要修改从表的配置文件,其他完全不变:
<class name="Address" table="relevance_address" dynamic-update="true">
<id name="id">
<!--Pay attention to here ! -->
<generator class="foreign">
<!-- Set the associated param : Address.person ; -->
<param name="property">person</param> </generator></id>
<property name="city"/>
<property name="postcode"/>
<!--Pay attention to here ! -->
<one-to-one name="person" constrained="true"></one-to-one>
</class>
测试类:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class ForTest {
Session session;
Transaction tx;
SessionFactory sessionFactory;
@Before
public void setUp() throws Exception {
System.out.println("------------数据初始化--------------");
Configuration config = new Configuration().configure("relevance/hibernate.cfg.xml");
sessionFactory = config.buildSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
}
@After
public void tearDown() throws Exception {
System.out.println("------------数据释放--------------");
tx.commit();
if(session.isOpen()) session.close();
sessionFactory.close();
}
@Test
public void test() {
Address address = new Address("Shanghai.China",0551);
session.persist(address);
}
@Test
public void testone2noe(){
Person person = new Person("Adim",30);
Address address = new Address("Shanghai.China",0551);
//这里很有趣,存入数据库以后,0551变成了361,估计是因为数据库中0开头表示八进制吧;
person.setAddress(address);
address.setPerson(person);
/* 注意这里,因为address是从表,且设定了not-null,因此person必须要先于address添加到库中
* 即,下面的书写顺序不能有变化;如果不设定not-null,则顺序变化也可以存入,但是会多一步操
* 作,影响性能,不建议;*/
session.persist(person);
session.persist(address);
}
@Test
public void testQuery_from_SlaveTable(){
Address address = session.load(Address.class, 1);
System.out.println(address);
System.out.println("------------------");
System.out.println(address.getPerson());
}
@Test
public void testQuery_from_MasterTable(){
Person person = session.load(Person.class, 1);
System.out.println(person);
System.out.println("------------------");
System.out.println(person.getAddress());
}
}
testQuery_from_SlaveTable 的测试的结果如下:
Address [id=1, city=Shanghai.China, postcode=361]
------------------
Hibernate: select person0_.id as id1_0_0_, person0_.name as name2_0_0_, person0_.age as age3_0_0_, address1_.id as id1_1_1_, address1_.city as city2_1_1_, address1_.postcode as postcode3_1_1_, address1_.person_id as person_i4_1_1_ from relevance person0_ left outer join relevance_address address1_ on person0_.id=address1_.id where person0_.id=?
Person [id=1, name=Adim, age=30]
------------数据释放--------------
需要打印person属性时,则重新发出了Query.
testQuery_from_MasterTable的测试结果如下:
Hibernate: select person0_.id as id1_0_0_, person0_.name as name2_0_0_, person0_.age as age3_0_0_, address1_.id as id1_1_1_, address1_.city as city2_1_1_, address1_.postcode as postcode3_1_1_, address1_.person_id as person_i4_1_1_ from relevance person0_
left outer join relevance_address address1_ on person0_.id=address1_.id where person0_.id=?
Person [id=1, name=Adim, age=30]
------------------
Address [id=1, city=Shanghai.China, postcode=361]
------------数据释放--------------
可以明显的看出来,这里只进行了一次Query,说明load主表时,从表被自动加载了