hibernate映射一对多,双向关系,初学例子三
2010-06-08 17:23
489 查看
customer bean
package bean;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;
@SuppressWarnings("serial")
public class Customer implements Serializable{
private Long id;
private String firstName = "N";
private String lastName = "N";
private int phone;
private boolean married;
private char sex;
private byte[]image;
private Timestamp registeredTime;
private int count;
private Set<Order> orderSet = new HashSet<Order>();
public Customer(){
//empty
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
protected String getName() {
return firstName + "-" + lastName;
}
protected void setName(String name) {
String [] names = name.split("-");
if(names.length >= 1){
this.firstName = names[0];
}
if(names.length >= 2){
this.lastName = names[1];
}
}
public int getPhone() {
return phone;
}
public void setPhone(int phone) {
this.phone = phone;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public byte[] getImage() {
return image;
}
public void setImage(byte[] image) {
this.image = image;
}
public Timestamp getRegisteredTime() {
return registeredTime;
}
public void setRegisteredTime(Timestamp registeredTime) {
this.registeredTime = registeredTime;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public Set<Order> getOrderSet() {
return orderSet;
}
public void setOrderSet(Set<Order> orderSet) {
this.orderSet = orderSet;
}
}
customer.hbm.xml 配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bean">
<class name="bean.Customer" table="t_customer">
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="name" column="name" type="string" not-null="true"/>
<property name="phone" column="phone" type="integer"/>
<property name="married" column="married" type="boolean"/>
<property name="sex" column="sex" type="character"/>
<property name="image" column="image" type="binary"/>
<property name="registeredTime" column="registered_time" type="timestamp"/>
<property name="count" formula="(select count(*) from t_customer as c)"/>
<set name="orderSet">
<key column="customer_id"/>
<one-to-many class="bean.Order"/>
</set>
</class>
</hibernate-mapping>
order bean
package bean;
import java.io.Serializable;
/**
*
* @author zwc
*
*/
@SuppressWarnings("serial")
public class Order implements Serializable{
private long id;
private String orderNumber;
private Customer customer;
public long getId() {
return id;
}
protected void setId(long id) {
this.id = id;
}
public String getOrderNumber() {
return orderNumber;
}
public void setOrderNumber(String orderNumber) {
this.orderNumber = orderNumber;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}
order.hbm.xml 配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bean">
<class name="Order" table="t_order">
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="orderNumber" column="order_number" type="string" not-null="true"/>
<many-to-one name="customer" column="customer_id" class="Customer"/>
</class>
</hibernate-mapping>
测试文件
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import bean.Customer;
import bean.Order;
@SuppressWarnings("serial")
public class OperateCustomer extends HttpServlet {
private static Logger logger = Logger.getLogger(OperateCustomer.class);
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.write("<title>Test-Hibernate</title>");
Session session = new Configuration()
.addClass(Customer.class)
.addClass(Order.class)
.buildSessionFactory()
.openSession();
Transaction t = (Transaction) session.beginTransaction();
Customer c = new Customer();
try {
session.beginTransaction();
c.setFirstName("IA");
c.setLastName("IB");
c.setMarried(false);
c.setSex('F');
c.setPhone(987654321);
c.setRegisteredTime(new Timestamp(System.currentTimeMillis()));
Order order = new Order();
order.setOrderNumber("fromCustomeIn");
order.setCustomer(c);
session.save(order);
Set<Order> orderSet = new HashSet<Order>();
orderSet.add(order);
c.setOrderSet(orderSet);
session.save(c);
注意:如果这里不用级联保存,则,必须,保证,order数据库中,对应的customer_id可以为空,并且配置文件里,设置, not-null="false",否则,在你保存,order,是会出现错误:
2010-06-08 17:09:36,203 [http-8080-2] ERROR [org.hibernate.util.JDBCExceptionReporter] - Column 'customer_id' cannot be null
2010-06-08 17:09:36,218 [http-8080-2] WARN [servlet.OperateCustomer] - 保存Customer失败
org.hibernate.exception.ConstraintViolationException: could not insert: [bean.Order]
在这,如果这里,不用session手动保存两个,可以直接在customer配置文件里,对应的set里设置级联保存: cascade="save-update",则,可以简略好多,具体怎么使用,视情况,个人而定!!
t.commit();
} catch (Exception e) {
logger.warn("保存Customer失败",e);
try {
t.rollback();
} catch (Exception e1) {
logger.warn("回滚失败");
}
}
Query query = session.createQuery("from Customer");
Iterator<Customer> i = (Iterator<Customer>) query.iterate();
while(i.hasNext()){
c = i.next();
out.println("count:" + c.getOrderSet().size() + "..................."+ c.getFirstName() + ":" + c.getLastName());
}
}
}
说明:如果按照上面的代码,你会发现,order数据库,被更新了两次,就是执行了两次update,这是因为,在
session.save(order); 和 c.setOrderSet(orderSet);session.save(c);
保存了两次,就更新了两次,
所以这里就用到了inverse="true"关键字,设置,customer配置文件里德set的inverse为true,则可以避免此种情况出现,
下图,是载自一本书的一段话,介绍了,inverse关键字用法的注意事项:
package bean;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;
@SuppressWarnings("serial")
public class Customer implements Serializable{
private Long id;
private String firstName = "N";
private String lastName = "N";
private int phone;
private boolean married;
private char sex;
private byte[]image;
private Timestamp registeredTime;
private int count;
private Set<Order> orderSet = new HashSet<Order>();
public Customer(){
//empty
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
protected String getName() {
return firstName + "-" + lastName;
}
protected void setName(String name) {
String [] names = name.split("-");
if(names.length >= 1){
this.firstName = names[0];
}
if(names.length >= 2){
this.lastName = names[1];
}
}
public int getPhone() {
return phone;
}
public void setPhone(int phone) {
this.phone = phone;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public byte[] getImage() {
return image;
}
public void setImage(byte[] image) {
this.image = image;
}
public Timestamp getRegisteredTime() {
return registeredTime;
}
public void setRegisteredTime(Timestamp registeredTime) {
this.registeredTime = registeredTime;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public Set<Order> getOrderSet() {
return orderSet;
}
public void setOrderSet(Set<Order> orderSet) {
this.orderSet = orderSet;
}
}
customer.hbm.xml 配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bean">
<class name="bean.Customer" table="t_customer">
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="name" column="name" type="string" not-null="true"/>
<property name="phone" column="phone" type="integer"/>
<property name="married" column="married" type="boolean"/>
<property name="sex" column="sex" type="character"/>
<property name="image" column="image" type="binary"/>
<property name="registeredTime" column="registered_time" type="timestamp"/>
<property name="count" formula="(select count(*) from t_customer as c)"/>
<set name="orderSet">
<key column="customer_id"/>
<one-to-many class="bean.Order"/>
</set>
</class>
</hibernate-mapping>
order bean
package bean;
import java.io.Serializable;
/**
*
* @author zwc
*
*/
@SuppressWarnings("serial")
public class Order implements Serializable{
private long id;
private String orderNumber;
private Customer customer;
public long getId() {
return id;
}
protected void setId(long id) {
this.id = id;
}
public String getOrderNumber() {
return orderNumber;
}
public void setOrderNumber(String orderNumber) {
this.orderNumber = orderNumber;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}
order.hbm.xml 配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bean">
<class name="Order" table="t_order">
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="orderNumber" column="order_number" type="string" not-null="true"/>
<many-to-one name="customer" column="customer_id" class="Customer"/>
</class>
</hibernate-mapping>
测试文件
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import bean.Customer;
import bean.Order;
@SuppressWarnings("serial")
public class OperateCustomer extends HttpServlet {
private static Logger logger = Logger.getLogger(OperateCustomer.class);
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.write("<title>Test-Hibernate</title>");
Session session = new Configuration()
.addClass(Customer.class)
.addClass(Order.class)
.buildSessionFactory()
.openSession();
Transaction t = (Transaction) session.beginTransaction();
Customer c = new Customer();
try {
session.beginTransaction();
c.setFirstName("IA");
c.setLastName("IB");
c.setMarried(false);
c.setSex('F');
c.setPhone(987654321);
c.setRegisteredTime(new Timestamp(System.currentTimeMillis()));
Order order = new Order();
order.setOrderNumber("fromCustomeIn");
order.setCustomer(c);
session.save(order);
Set<Order> orderSet = new HashSet<Order>();
orderSet.add(order);
c.setOrderSet(orderSet);
session.save(c);
注意:如果这里不用级联保存,则,必须,保证,order数据库中,对应的customer_id可以为空,并且配置文件里,设置, not-null="false",否则,在你保存,order,是会出现错误:
2010-06-08 17:09:36,203 [http-8080-2] ERROR [org.hibernate.util.JDBCExceptionReporter] - Column 'customer_id' cannot be null
2010-06-08 17:09:36,218 [http-8080-2] WARN [servlet.OperateCustomer] - 保存Customer失败
org.hibernate.exception.ConstraintViolationException: could not insert: [bean.Order]
在这,如果这里,不用session手动保存两个,可以直接在customer配置文件里,对应的set里设置级联保存: cascade="save-update",则,可以简略好多,具体怎么使用,视情况,个人而定!!
t.commit();
} catch (Exception e) {
logger.warn("保存Customer失败",e);
try {
t.rollback();
} catch (Exception e1) {
logger.warn("回滚失败");
}
}
Query query = session.createQuery("from Customer");
Iterator<Customer> i = (Iterator<Customer>) query.iterate();
while(i.hasNext()){
c = i.next();
out.println("count:" + c.getOrderSet().size() + "..................."+ c.getFirstName() + ":" + c.getLastName());
}
}
}
说明:如果按照上面的代码,你会发现,order数据库,被更新了两次,就是执行了两次update,这是因为,在
session.save(order); 和 c.setOrderSet(orderSet);session.save(c);
保存了两次,就更新了两次,
所以这里就用到了inverse="true"关键字,设置,customer配置文件里德set的inverse为true,则可以避免此种情况出现,
下图,是载自一本书的一段话,介绍了,inverse关键字用法的注意事项:
相关文章推荐
- hibernate映射一对多,双向关系[关联自身],初学例子四
- hibernate映射一对多,单向关系,初学例子二
- Hibernate 关系映射 —— 双向(一对多)多对一
- hibernate映射 【映射继承关系】,初学例子六
- Hibernate关系映射级别注解(一对多单向外键关联、一对多(多对一)双向外键关联)
- Hibernate双向一对一,一对多,多对多关系映射
- hibernate映射关系 一对多、多对一单向关联 一对多双向关联
- hibernate映射 【映射组成关系】,初学例子五
- Hibernate关系映射(五)一对多、多对一双向关联@OneToMany @OneToMany Annotation方式
- Hibernate中,One2Many和Many2One的双向映射关系的基于注解Annotation实现方式
- Hibernate中一对多、多对一关系的映射
- Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式 双向关联和单向关联的区别
- hibernate对象关系映射(一对一,一对多,多对一,多对多的单向,双向映射)
- 技术点-hibernate关系映射-多对多单向/双向
- hibernate 关系映射之 双向外键关联一对一
- Hibernate 双向 多 对 1 对象关系映射 下 ,测试 crud
- Hibernate关系映射级别注解(一对一双向外键关联、一对一双向外键联合主键)
- hibernate映射关系之一对一双向主键关联
- Hibernate关系映射(七)多对多双向关联@ManyToMany Annotation方式
- Hibernate关系映射2:双向1-N关联