hibernate :一对多 one-2-many 单向关联 实例 延迟加载 测试
关系:
用户 1 ------> n 地址
User Address
单向关联实例(入门使用):
Maven工程结构如下:

pom.xml:
1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 4 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 <groupId>com.zjc.hibernate</groupId> 7 <artifactId>hibernate-one2many</artifactId> 8 <version>0.0.1-SNAPSHOT</version> 9 <dependencies> 10 <!-- junit --> 11 <dependency> 12 <groupId>junit</groupId> 13 <artifactId>junit</artifactId> 14 <version>4.8.2</version> 15 </dependency> 16 <!-- mysql --> 17 <dependency> 18 <groupId>mysql</groupId> 19 <artifactId>mysql-connector-java</artifactId> 20 <version>5.1.9</version> 21 </dependency> 22 <!-- hibernate --> 23 <dependency> 24 <groupId>org.hibernate</groupId> 25 <artifactId>hibernate</artifactId> 26 <version>3.2.6.ga</version> 27 <!-- <exclusions> <exclusion> <groupId>cglib</groupId> <artifactId>cglib</artifactId> 28 </exclusion> </exclusions> --> 29 </dependency> 30 <dependency> 31 <groupId>javax.transaction</groupId> 32 <artifactId>jta</artifactId> 33 <version>1.0.1B</version> 34 </dependency> 35 <!-- hibernate core dependency library --> 36 <dependency> 37 <groupId>dom4j</groupId> 38 <artifactId>dom4j</artifactId> 39 <version>1.6.1</version> 40 </dependency> 41 <!-- <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> 42 <version>2.1_3</version> </dependency> --> 43 <dependency> 44 <groupId>commons-logging</groupId> 45 <artifactId>commons-logging</artifactId> 46 <version>1.1.1</version> 47 </dependency> 48 <dependency> 49 <groupId>commons-collections</groupId> 50 <artifactId>commons-collections</artifactId> 51 <version>3.2.1</version> 52 </dependency> 53 </dependencies> 54 <!-- Missing artifact javax.transaction:jta:jar:1.0.1B:compile 下面是解决办法 --> 55 <repositories> 56 <repository> 57 <id>java</id> 58 <name>java official repository</name> 59 <url>http://download.java.net/maven/2/</url> 60 </repository> 61 </repositories> 62 </project> 63 </project>
User.java:
1 package com.zjc.bean; 2 3 import java.io.Serializable; 4 import java.util.HashSet; 5 import java.util.Set; 6 7 public class User implements Serializable { 8 /** 9 * 10 */ 11 private static final long serialVersionUID = 1L; 12 13 private int id; 14 private String name; 15 private int age; 16 17 private Set<Address> addresses = new HashSet<Address>(); 18 19 public Set<Address> getAddresses() { 20 return addresses; 21 } 22 public void setAddresses(Set<Address> addresses) { 23 this.addresses = addresses; 24 } 25 public int getId() { 26 return id; 27 } 28 public void setId(int id) { 29 this.id = id; 30 } 31 public String getName() { 32 return name; 33 } 34 public void setName(String name) { 35 this.name = name; 36 } 37 public int getAge() { 38 return age; 39 } 40 public void setAge(int age) { 41 this.age = age; 42 } 43 }
Address.java:
1 package com.zjc.bean; 2 3 import java.io.Serializable; 4 5 public class Address implements Serializable { 6 /** 7 * 8 */ 9 private static final long serialVersionUID = 1L; 10 11 private int id; 12 private String addr; 13 14 public int getId() { 15 return id; 16 } 17 public void setId(int id) { 18 this.id = id; 19 } 20 public String getAddr() { 21 return addr; 22 } 23 public void setAddr(String addr) { 24 this.addr = addr; 25 } 26 }
User.hbm.xml:
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated Aug 9, 2013 11:40:18 AM by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.zjc.bean.User" table="USER"> 7 <id name="id" type="int"> 8 <column name="ID" /> 9 <generator class="native" /> 10 </id> 11 <property name="name" type="java.lang.String"> 12 <column name="NAME" /> 13 </property> 14 <property name="age" type="int"> 15 <column name="AGE" /> 16 </property> 17 <set name="addresses" table="ADDRESS" inverse="false" lazy="true" cascade="all" sort="unsorted"> 18 <key> 19 <column name="USER_ID" /> 20 </key> 21 <one-to-many class="com.zjc.bean.Address" /> 22 </set> 23 </class> 24 </hibernate-mapping>
Address.hbm.xml:
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated Aug 9, 2013 11:40:18 AM by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.zjc.bean.Address" table="ADDRESS"> 7 <id name="id" type="int"> 8 <column name="ID" /> 9 <generator class="native" /> 10 </id> 11 <property name="addr" type="java.lang.String"> 12 <column name="ADDR" /> 13 </property> 14 </class> 15 </hibernate-mapping>
hibernate.cfg.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- Database connection settings --> 8 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 9 <property name="connection.url">jdbc:mysql://127.0.0.1:3306/test</property> 10 <property name="connection.username">root</property> 11 <property name="connection.password">root</property> 12 13 <!-- JDBC connection pool (use the built-in) --> 14 <property name="connection.pool_size">1</property> 15 16 <!-- SQL dialect --> 17 <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 18 19 <!-- Enable Hibernate's automatic session context management --> 20 <property name="current_session_context_class">thread</property> 21 22 <!-- Disable the second-level cache --> 23 <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 24 25 <!-- Echo all executed SQL to stdout --> 26 <property name="show_sql">true</property> 27 28 <!-- fromat sql --> 29 <property name="format_sql">true</property> 30 31 <!-- Drop and re-create the database schema on startup --> 32 <property name="hbm2ddl.auto">update</property> 33 34 <mapping resource="com/zjc/bean/User.hbm.xml" /> 35 <mapping resource="com/zjc/bean/Address.hbm.xml"/> 36 37 </session-factory> 38 </hibernate-configuration>
HibernateUtil.java:
1 package com.zjc.util; 2 3 import org.hibernate.SessionFactory; 4 import org.hibernate.cfg.Configuration; 5 6 public class HibernateUtil { 7 private static final SessionFactory sessionFactory = buildSessionFactory(); 8 9 private static SessionFactory buildSessionFactory() { 10 // TODO Auto-generated method stub 11 return new Configuration().configure().buildSessionFactory(); 12 } 13 14 public static SessionFactory getInstance() { 15 return sessionFactory; 16 } 17 }
Manage.java:
1 import java.util.Iterator; 2 import java.util.Set; 3 4 import org.hibernate.Query; 5 import org.hibernate.Session; 6 import org.hibernate.Transaction; 7 import org.junit.Test; 8 9 import com.zjc.bean.Address; 10 import com.zjc.bean.User; 11 import com.zjc.util.HibernateUtil; 12 13 14 public class Manage { 15 16 @Test 17 public void test_one2many() { 18 Session session = HibernateUtil.getInstance().getCurrentSession(); 19 Transaction tx = session.beginTransaction(); 20 21 //插入数据 22 /*User user = new User(); 23 user.setAge(22); 24 user.setName("lisi"); 25 26 Address address = new Address(); 27 address.setAddr("长沙市,雨花区"); 28 29 Address address2 = new Address(); 30 address2.setAddr("长沙市,开福区"); 31 32 user.getAddresses().add(address); 33 user.getAddresses().add(address2); 34 35 session.save(user);*/ 36 37 //即时加载(在one的一方设置是lazy=false) 38 String hql = "from User where name = :name"; 39 Query query = session.createQuery(hql); 40 41 //传参数方式1 42 //query.setParameter("name", "lisi"); 43 44 //传参数方式2 45 User addUser = new User(); 46 addUser.setName("lisi"); 47 48 query.setProperties(addUser); 49 50 //查询结果 51 Iterator it = query.iterate(); 52 while (it.hasNext()) { 53 User user = (User) it.next(); 54 System.out.println(user.getId() + "," + user.getName() + "," + user.getAge()); 55 56 Set<Address> addresses = user.getAddresses(); 57 //执行下面这句才会去查询address表,这就是延迟加载的作用[可以在上面这句加个断点,Debug即可] 58 Iterator<Address> iterator = addresses.iterator(); 59 while (iterator.hasNext()) { 60 Address address = iterator.next(); 61 System.out.println(address.getAddr()); 62 } 63 } 64 65 tx.commit(); 66 } 67 }
posted on 2013-08-09 14:52 zenger1025 阅读(338) 评论(0) 收藏 举报
浙公网安备 33010602011771号