您的位置:首页 > 其它

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关键字用法的注意事项:



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息