数据库sql
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`person_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`address_id` int(11) DEFAULT NULL,
PRIMARY KEY (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `address`;
CREATE TABLE `address` (
`address_id` int(11) NOT NULL AUTO_INCREMENT,
`address` varchar(50) DEFAULT NULL,
PRIMARY KEY (`address_id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;
Person实体类
package org.lei.model;
import java.io.Serializable;
public class Person implements Serializable{
private Integer personId;
private String name;
private Address address;
public Integer getPersonId() {
return personId;
}
public void setPersonId(Integer personId) {
this.personId = personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Person(){}
}
Address实体类
package org.lei.model;
import java.io.Serializable;
public class Address implements Serializable{
private Integer addressId;
private String address;
public Address(){}
public Integer getAddressId() {
return addressId;
}
public void setAddressId(Integer addressId) {
this.addressId = addressId;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
person.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">
<hibernate-mapping>
<class name = "org.lei.model.Person" table="person">
<id name = "personId" type="java.lang.Integer">
<column name="person_id"/>
<generator class="native"></generator>
</id>
<property name ="name" type="java.lang.String">
<column name="name" length="10"/>
</property>
<many-to-one name="address" column="address_id"
class="org.lei.model.Address" outer-join="true"
cascade="save-update">
</many-to-one>
<!-- Hibernate outer-join参数允许下列三个不同值:
auto:(默认) 使用外连接抓取关联(对象),如果被关联的对象没有代理(proxy)
true:一直使用外连接来抓取关联
false:永远不使用外连接来抓取关联 -->
</class>
</hibernate-mapping>
address.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">
<hibernate-mapping>
<class name ="org.lei.model.Address" table="address" >
<id name="addressId" type="java.lang.Integer">
<column name="address_id"/>
<generator class="native" >
</generator>
</id>
<property name ="address" type="java.lang.String">
<column name ="address" length="50"/>
</property>
</class>
</hibernate-mapping>
Test类
package com.test;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.lei.model.Address;
import org.lei.model.Person;
public class TestPersonAddress {
public static void main(String []args){
//configuration 管理hibernate配置
Configuration configuration = new Configuration().configure();
//根据Configuration建立SessionFatory
SessionFactory sessionFactory = configuration.buildSessionFactory();
Address address1 = new Address();
address1.setAddress("address1");
Address address2 = new Address();
address2.setAddress("address2");
Person person1 = new Person();
Person person2 = new Person();
Person person3 = new Person();
person1.setName("person1");
person1.setAddress(address1);
person2.setName("person2");
person2.setAddress(address2);
person3.setName("person3");
person3.setAddress(address1);
Integer pid = null ;//定义主键变量
Session session = sessionFactory.openSession();//添加数据
Transaction tx = null;//开始事务
try{
tx = session.beginTransaction();
//创建主键变量
pid = (Integer)session.save(person1);
session.save(person2);
session.save(person3);
tx.commit();
}catch (RuntimeException e){
if(tx!=null){
tx.rollback();
throw e;
}
}
finally{
session.close();
}
/**
* 修改person1,并修改对应的地址为address
*/
session = sessionFactory.openSession();
tx = null;
try {
tx = session.beginTransaction();
person1 = (Person)session.get(Person.class, pid);
person1.setName("person1 update");
person1.getAddress().setAddress("address1 update");
session.update(person1);
tx.commit();
} catch (RuntimeException e){
if(tx!=null){
tx.rollback();
throw e;
}
}
finally{
session.close();
}
/**
* 查询数据
*/
session = sessionFactory.openSession();
tx = session.beginTransaction();
person1 = (Person)session.get(Person.class, pid);
System.out.println("person name :" +person1.getName());
System.out.println("person address :"+person1.getAddress().getAddress());
session.close();
/**
* 删除数据
*/
session = sessionFactory.openSession();
tx = null;//开始事务
try {
tx = session.beginTransaction();
person1 = (Person) session.get(Person.class, pid);
session.delete(person1);
tx.commit();
} catch (RuntimeException e){
if(tx!=null){
tx.rollback();
throw e;
}
}
finally{
session.close();
}
/**
* 反向添加数据
*/
Address address3 = new Address();
address3.setAddress("address3");
session = sessionFactory.openSession();
tx = null;
try {
tx = session.beginTransaction();
session.save(address3);
tx.commit();
}catch (RuntimeException e){
if(tx!=null){
tx.rollback();
throw e;
}
}
finally{
session.close();
}
sessionFactory.close();//关闭sessionfactory
}
}
关键总结
1、注意理解person.hbm.xml映射文件
2、由于是多对一关系,控制方Person需要增加Address属性,用来表示对应一个Address。
3、多对一使用many-to-one元素
4、cascade属性表示当空置方(Person)在进行添加、修改‘、删除时,是否关联被控制方(Address)。这里是save-update,即在添加、修改时关联
5、outer-join设置为true,即在查询关联对象时,一个sql语句就可以查出;如果设置为false,则使用抖个sql语句查出数据