Hibernate -- 项目结构模型改造, 加 Utils 和 Dao层
示例代码:
App.java 模拟客户端
/** * 模拟客户端 */ public class App { @Test public void saveCustomer(){ CustomerDao customerDao=new CustomerDao(); Customer customer=new Customer(); customer.setName("西毒"); customerDao.saveCustomer(customer); } @Test public void updateCustomer(){ CustomerDao customerDao=new CustomerDao(); Customer customer=new Customer(); customer.setId(1); customer.setName("西门公子"); customerDao.updateCustomer(customer); } @Test public void findCustomerById(){ CustomerDao customerDao=new CustomerDao(); Customer c=customerDao.getCustomerById(1); if(c!=null){ System.out.println(c.getId()+" "+c.getName()); } } @Test public void findCustomers(){ CustomerDao customerDao=new CustomerDao(); List<Customer> list=customerDao.findCustomers(); if(list!=null&&list.size()>0){ for(Customer c:list){ System.out.println(c.getId()+" "+c.getName()); } } } @Test public void deleteCustomerById(){ CustomerDao customerDao=new CustomerDao(); customerDao.deleteCustomerById(1); } }
CustomerDao.java Dao层代码
/** * Dao */ public class CustomerDao { public void saveCustomer(Customer customer) { Session session=null; Transaction tx=null; try { session=HibernateUtil.getSession(); if(session!=null){ tx=HibernateUtil.beginTransaction(session); session.save(customer); HibernateUtil.commitTransaction(tx); } } catch (HibernateException e) { e.printStackTrace(); //事务回滚 HibernateUtil.rollbackTransaction(tx); }finally{ HibernateUtil.closeSession(session); } } public void updateCustomer(Customer customer) { Session session=null; Transaction tx=null; try { session=HibernateUtil.getSession(); if(session!=null){ tx=HibernateUtil.beginTransaction(session); session.update(customer); HibernateUtil.commitTransaction(tx); } } catch (HibernateException e) { e.printStackTrace(); //事务回滚 HibernateUtil.rollbackTransaction(tx); }finally{ HibernateUtil.closeSession(session); } } public Customer getCustomerById(Serializable i) { Session session=null; Transaction tx=null; Customer customer=null; try { session=HibernateUtil.getSession(); if(session!=null){ tx=HibernateUtil.beginTransaction(session); customer=(Customer)session.get(Customer.class, i); HibernateUtil.commitTransaction(tx); } } catch (HibernateException e) { e.printStackTrace(); //事务回滚 HibernateUtil.rollbackTransaction(tx); }finally{ HibernateUtil.closeSession(session); } return customer; } public List<Customer> findCustomers() { Session session=null; Transaction tx=null; List<Customer> list=null; try { session=HibernateUtil.getSession(); if(session!=null){ tx=HibernateUtil.beginTransaction(session); Query query=session.createQuery("from Customer c"); list=query.list(); HibernateUtil.commitTransaction(tx); } } catch (HibernateException e) { e.printStackTrace(); //事务回滚 HibernateUtil.rollbackTransaction(tx); }finally{ HibernateUtil.closeSession(session); } return list; } public void deleteCustomerById(Serializable id) { Session session=null; Transaction tx=null; try { session=HibernateUtil.getSession(); if(session!=null){ tx=HibernateUtil.beginTransaction(session); Customer c=(Customer)session.get(Customer.class, id); session.delete(c); HibernateUtil.commitTransaction(tx); } } catch (HibernateException e) { e.printStackTrace(); //事务回滚 HibernateUtil.rollbackTransaction(tx); }finally{ HibernateUtil.closeSession(session); } } }
HibernateUtil.java 工具类
public class HibernateUtil { private static SessionFactory sf=null; static{ Configuration config=new Configuration(); config.configure("cn/itcast/add/hibernate.cfg.xml"); sf=config.buildSessionFactory(); } //获取session public static Session getSession(){ if(sf!=null){ return sf.openSession(); } return null; } //关闭session public static void closeSession(Session session){ if(session!=null&&session.isOpen()){ session.close(); } } //开始事务 public static Transaction beginTransaction(Session session){ if(session!=null&&session.isOpen()){ return session.beginTransaction(); } return null; } //提交事务 public static void commitTransaction(Transaction tx){ if(tx!=null&&!tx.wasCommitted()){ tx.commit(); } } //回滚事务 public static void rollbackTransaction(Transaction tx){ if(tx!=null&&!tx.wasRolledBack()){ tx.rollback(); } } }
Customer.java bean对象
/** * 一的一端 */ @SuppressWarnings("serial") public class Customer implements java.io.Serializable { private Integer id; private String name; //一个客户对应多个订单 private Set<Order> orderes=new HashSet<Order>(0); 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 Set<Order> getOrderes() { return orderes; } public void setOrderes(Set<Order> orderes) { this.orderes = orderes; } }
Order.java bean对象
/** * 多的一端 */ public class Order { private Integer id; private String orderNumber; private Double price; //建立订单到客户的多一关联 private Customer customer; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getOrderNumber() { return orderNumber; } public void setOrderNumber(String orderNumber) { this.orderNumber = orderNumber; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } }
Customer.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="cn.itcast.add.Customer" table="customers"> <id name="id" type="integer"> <column name="id"/> <generator class="increment"/> </id> <property name="name" type="string"> <column name="name"/> </property> <set name="orderes" table="orders" inverse="true"> <key> <column name="customer_id"/> </key> <one-to-many class="cn.itcast.add.Order"/> </set> </class> </hibernate-mapping>
Order.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="cn.itcast.add.Order" table="orders"> <id name="id" type="integer"> <column name="id"/> <generator class="increment"/> </id> <property name="orderNumber" type="string"> <column name="orderNumber"/> </property> <property name="price" type="double"> <column name="price"/> </property> <many-to-one name="customer" class="cn.itcast.add.Customer"> <column name="customer_id"/> </many-to-one> </class> </hibernate-mapping>
hibernate.cfg.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <!-- 加载映射文件--> <mapping resource="cn/itcast/add/Customer.hbm.xml"/> <mapping resource="cn/itcast/add/Order.hbm.xml"/> </session-factory> </hibernate-configuration>
关于配置文件中使用 entity-name 指向实体, 可做如下修改
Customer.hbm.xml 使用entity-name 指向实体
<?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> <!-- entity-name:指向的名称才是在程序中真正要用到的实体的名称,可以理解成name的别名, 当entity-name存在时,entity-name优先 如果entity-name没有配置,责默认的实体的名称是name执行的类名 --> <class name="cn.itcast.entityname.Customer" entity-name="CustomerE" table="customers"> <id name="id" type="integer"> <column name="id"/> <generator class="increment"/> </id> <property name="name" type="string"> <column name="name"/> </property> <set name="orderes" table="orders" inverse="true"> <key> <column name="customer_id"/> </key> <one-to-many entity-name="OrderE"/> </set> </class> </hibernate-mapping>
这时Dao的代码则需要做相应的改变, 比如saveCustomer时 需要改为 session.save("CustomerE",customer);
必须使用指定的实体名。