hibernate注解demo

来源:互联网 发布:过程控制 动画 软件 编辑:程序博客网 时间:2024/06/05 10:05

用一个简单的例子,来记一下,hibernate的部分注解的使用和配置。我这里还是举出一些最常见的,如单向和双向的一对多,单向和双向的多对多。新建个Java工程,做测试类来说明,我打算这样干。

 

首先是单向的一对多,代码如下,先是两个实体类:

 

Java代码
  1. package cn.serup.model;  
  2.   
  3. import java.util.Set;  
  4.   
  5. import javax.persistence.Entity;  
  6. import javax.persistence.GeneratedValue;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.JoinColumn;  
  9. import javax.persistence.OneToMany;  
  10.   
  11.   
  12. @Entity  
  13. public class Organization {  
  14.       
  15.     private int id ;  
  16.       
  17.     private String orgName ;  
  18.       
  19.     private Set<Company> company ;  
  20.   
  21.     @OneToMany  
  22.     @JoinColumn(name="orgid")  
  23.     /** 
  24.      * 一对多注解@OneToMany(单向) 
  25.      * 如果只写@OneToMany的话,hibernate会建一张中间表来 
  26.      * 维护他们之间的关系, 
  27.      * 加上@JoinColumn(name="orgid"),则不会建中间表,他会在 
  28.      * 多的一端加上外键orgid,来维护他们之间的关系 
  29.      */  
  30.     public Set<Company> getCompany() {  
  31.         return company;  
  32.     }  
  33.   
  34.     @Id  
  35.     @GeneratedValue  
  36.     public int getId() {  
  37.         return id;  
  38.     }  
  39.   
  40.     public String getOrgName() {  
  41.         return orgName;  
  42.     }  
  43.   
  44.     public void setCompany(Set<Company> company) {  
  45.         this.company = company;  
  46.     }  
  47.   
  48.     public void setId(int id) {  
  49.         this.id = id;  
  50.     }  
  51.   
  52.     public void setOrgName(String orgName) {  
  53.         this.orgName = orgName;  
  54.     }  
  55. }  

 

 

 

Java代码
  1. package cn.serup.model;  
  2.   
  3. import javax.persistence.Entity;  
  4. import javax.persistence.GeneratedValue;  
  5. import javax.persistence.Id;  
  6.   
  7. @Entity  
  8. public class Company {  
  9.       
  10.     private int id ;  
  11.       
  12.     private String compayName ;  
  13.       
  14.     @Id  
  15.     @GeneratedValue  
  16.     public int getId() {  
  17.         return id;  
  18.     }  
  19.   
  20.     public void setId(int id) {  
  21.         this.id = id;  
  22.     }  
  23.   
  24.     public String getCompayName() {  
  25.         return compayName;  
  26.     }  
  27.   
  28.     public void setCompayName(String compayName) {  
  29.         this.compayName = compayName;  
  30.     }  
  31. }  

 

 

然后,测试类代码如下:

Java代码
  1. package cn.serup.hibernate.test;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Iterator;  
  5. import java.util.Set;  
  6.   
  7. import org.hibernate.Session;  
  8. import org.hibernate.SessionFactory;  
  9. import org.hibernate.cfg.AnnotationConfiguration;  
  10. import org.hibernate.tool.hbm2ddl.SchemaExport;  
  11. import org.junit.AfterClass;  
  12. import org.junit.BeforeClass;  
  13. import org.junit.Test;  
  14.   
  15. import cn.serup.model.Company;  
  16. import cn.serup.model.Organization;  
  17.   
  18. public class Many2One {  
  19.       
  20.     private static SessionFactory sessionFactory ;  
  21.       
  22.     @SuppressWarnings("unchecked")  
  23.     @Test  
  24.     public void testSaveOne2One() {  
  25.         Organization o = new Organization() ;  
  26.         o.setOrgName("谷度培训机构") ;  
  27.   
  28.         Company c = new Company() ;  
  29.         c.setCompayName("广州分公司") ;  
  30.           
  31.         Company c1 = new Company() ;  
  32.         c1.setCompayName("成都分公司") ;  
  33.           
  34.         Company c2 = new Company() ;  
  35.         c2.setCompayName("天津分公司") ;  
  36.           
  37.         Set set = new HashSet() ;  
  38.         set.add(c) ;  
  39.         set.add(c1) ;  
  40.         set.add(c2) ;  
  41.           
  42.         o.setCompany(set) ;  
  43.           
  44.         Session session = sessionFactory.getCurrentSession() ;  
  45.         session.beginTransaction() ;  
  46.           
  47.         session.save(o) ;  
  48.         session.save(c) ;  
  49.         session.save(c1) ;  
  50.         session.save(c2) ;  
  51.           
  52.         session.beginTransaction().commit() ;  
  53.     }  
  54.       
  55.     @SuppressWarnings("unchecked")  
  56.     @Test  
  57.     public void testLoadOne2One() {  
  58.         Session session = sessionFactory.getCurrentSession() ;  
  59.         session.beginTransaction() ;  
  60.           
  61.         Organization o = (Organization)session.load(Organization.class1) ;  
  62.           
  63.         System.out.println(o.getId()+" "+o.getOrgName()) ;  
  64.           
  65.         Set list = o.getCompany() ;  
  66.           
  67.         for(Iterator it = list.iterator(); it.hasNext();) {  
  68.             Company c = (Company)it.next() ;  
  69.             System.out.println(c.getId()+" "+c.getCompayName());  
  70.         }  
  71.           
  72.         session.beginTransaction().commit() ;  
  73.     }  
  74.       
  75.     @Test  
  76.     public void testDeleteOne2One() {  
  77.         Session session = sessionFactory.getCurrentSession() ;  
  78.         session.beginTransaction() ;  
  79.   
  80.         //Company c = (Company) session.load(Company.class, 1) ;  
  81.           
  82.         //session.delete(c) ;  
  83.           
  84.         session.beginTransaction().commit() ;  
  85.     }  
  86.       
  87.     @BeforeClass  
  88.     public static void beforeClass() {  
  89.         new SchemaExport(new AnnotationConfiguration().configure())  
  90.         .create(truetrue) ;  
  91.           
  92.         sessionFactory = new AnnotationConfiguration().configure()  
  93.         .buildSessionFactory() ;  
  94.     }  
  95.       
  96.     @AfterClass  
  97.     public static void afterClass() {  
  98.         sessionFactory.close() ;  
  99.     }  
  100.   
  101. }  

 最后是hibernate的cfg.xml配置,代码如下:

 

 

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.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
  8.         <property name="hibernate.connection.password">123456</property>  
  9.         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>  
  10.         <property name="hibernate.connection.username">root</property>  
  11.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
  12.         <property name="show_sql">true</property>  
  13.         <!-- 独立线程运行,如果通过getCurrentSession()来获得Session,需要设置如下 -->  
  14.         <property name="current_session_context_class">thread</property>  
  15. <!--         <property name="hibernate.hbm2ddl.auto">create</property> -->  
  16.          <!-- 映射持久化类 -->  
  17.           
  18.         <mapping class="cn.serup.model.Company"/>  
  19.         <mapping class="cn.serup.model.Organization"/>  
  20.   
  21.           
  22.     </session-factory>  
  23. </hibernate-configuration>  

 以上则是单向的一对多,即company里有organization的对象,organization里没有其他关联对象。

 

 

下面就是双向的一对多,即company里有organization的对象,organization里有company的set。只需要修改上面的代码即可,实体类代码如下(就是修改一点点就可以了):

 

Java代码
  1. package cn.serup.model;  
  2.   
  3. import java.util.Set;  
  4.   
  5. import javax.persistence.Entity;  
  6. import javax.persistence.GeneratedValue;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.JoinColumn;  
  9. import javax.persistence.OneToMany;  
  10.   
  11.   
  12. @Entity  
  13. public class Organization {  
  14.       
  15.     private int id ;  
  16.       
  17.     private String orgName ;  
  18.       
  19.     private Set<Company> company ;  
  20.   
  21.   
  22.     @OneToMany(mappedBy="org")  
  23.     @JoinColumn(name="orgid")  
  24.     /** 
  25.      * 一对多双向,在一的一端中设置mappedBy 
  26.      * 说明多的一端为主导 
  27.      * 如果指定了外键字段名称,则多的一端也需要指定相同的字段名称 
  28.      */  
  29.     public Set<Company> getCompany() {  
  30.         return company;  
  31.     }  
  32.   
  33.     public void setCompany(Set<Company> company) {  
  34.         this.company = company;  
  35.     }  
  36.   
  37.     public String getOrgName() {  
  38.         return orgName;  
  39.     }  
  40.   
  41.     public void setOrgName(String orgName) {  
  42.         this.orgName = orgName;  
  43.     }  
  44.   
  45.     @Id  
  46.     @GeneratedValue  
  47.     public int getId() {  
  48.         return id;  
  49.     }  
  50.   
  51.     public void setId(int id) {  
  52.         this.id = id;  
  53.     }  
  54.   
  55.   
  56. }  

 

Java代码
  1. package cn.serup.model;  
  2.   
  3. import javax.persistence.Entity;  
  4. import javax.persistence.GeneratedValue;  
  5. import javax.persistence.Id;  
  6. import javax.persistence.JoinColumn;  
  7. import javax.persistence.ManyToOne;  
  8.   
  9. @Entity  
  10. public class Company {  
  11.       
  12.     private int id ;  
  13.       
  14.     private String compayName ;  
  15.       
  16.     private Organization org ;  
  17.       
  18.     @ManyToOne  
  19.     @JoinColumn(name="orgid")  
  20.     /** 
  21.      * 一对多双向 
  22.      * 需要指定外键与一的一端给的外键名称一致,@JoinColumn(name="orgid") 
  23.      * 也可以不指定,如果在多的一端不指定,则一的一端也不能指定 
  24.      * 否则为生成两个外键 
  25.      */  
  26.     public Organization getOrg() {  
  27.         return org;  
  28.     }  
  29.   
  30.     public void setOrg(Organization org) {  
  31.         this.org = org;  
  32.     }  
  33.   
  34.     @Id  
  35.     @GeneratedValue  
  36.     public int getId() {  
  37.         return id;  
  38.     }  
  39.   
  40.     public void setId(int id) {  
  41.         this.id = id;  
  42.     }  
  43.   
  44.     public String getCompayName() {  
  45.         return compayName;  
  46.     }  
  47.   
  48.     public void setCompayName(String compayName) {  
  49.         this.compayName = compayName;  
  50.     }  
  51.   
  52.   
  53. }  

 单向的多对多的测试代码如下,至于hibernate的cfg.xml就不用变了:

 

 

Java代码
  1. package cn.serup.hibernate.test;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.Set;  
  5.   
  6. import org.hibernate.Session;  
  7. import org.hibernate.SessionFactory;  
  8. import org.hibernate.cfg.AnnotationConfiguration;  
  9. import org.hibernate.tool.hbm2ddl.SchemaExport;  
  10. import org.junit.AfterClass;  
  11. import org.junit.BeforeClass;  
  12. import org.junit.Test;  
  13.   
  14. import cn.serup.model.Company;  
  15. import cn.serup.model.Organization;  
  16.   
  17. public class Many2One {  
  18.       
  19.     private static SessionFactory sessionFactory ;  
  20.       
  21.     @Test  
  22.     public void testSaveOne2One() {  
  23.         Organization o = new Organization() ;  
  24.         o.setOrgName("谷度培训机构") ;  
  25.   
  26.         Company c = new Company() ;  
  27.         c.setCompayName("广州分公司") ;  
  28.         c.setOrg(o) ;  
  29.           
  30.         Company c1 = new Company() ;  
  31.         c1.setCompayName("成都分公司") ;  
  32.         c1.setOrg(o) ;  
  33.           
  34.         Company c2 = new Company() ;  
  35.         c2.setCompayName("天津分公司") ;  
  36.         c2.setOrg(o) ;  
  37.           
  38.           
  39.           
  40.         Session session = sessionFactory.getCurrentSession() ;  
  41.         session.beginTransaction() ;  
  42.           
  43.         session.save(o) ;  
  44.         session.save(c) ;  
  45.         session.save(c1) ;  
  46.         session.save(c2) ;  
  47.           
  48.         session.beginTransaction().commit() ;  
  49.     }  
  50.       
  51.     @SuppressWarnings("unchecked")  
  52.     @Test  
  53.     public void testLoadOne2One() {  
  54.         Session session = sessionFactory.getCurrentSession() ;  
  55.         session.beginTransaction() ;  
  56.           
  57.         Organization o = (Organization)session.load(Organization.class1) ;  
  58.           
  59.         System.out.println(o.getId()+" "+o.getOrgName()) ;  
  60.           
  61.         Set set = o.getCompany() ;  
  62.           
  63.         for(Iterator it = set.iterator(); it.hasNext();) {  
  64.             Company c = (Company)it.next() ;  
  65.             System.out.println(c.getId()+" "+c.getCompayName());  
  66.         }  
  67.           
  68.         session.beginTransaction().commit() ;  
  69.     }  
  70.       
  71.     @Test  
  72.     public void testDeleteOne2One() {  
  73.         Session session = sessionFactory.getCurrentSession() ;  
  74.         session.beginTransaction() ;  
  75.   
  76.         //Company c = (Company) session.load(Company.class, 1) ;  
  77.           
  78.         //session.delete(c) ;  
  79.           
  80.         session.beginTransaction().commit() ;  
  81.     }  
  82.       
  83.     @BeforeClass  
  84.     public static void beforeClass() {  
  85.         new SchemaExport(new AnnotationConfiguration().configure())  
  86.         .create(truetrue) ;  
  87.           
  88.         sessionFactory = new AnnotationConfiguration().configure()  
  89.         .buildSessionFactory() ;  
  90.     }  
  91.       
  92.     @AfterClass  
  93.     public static void afterClass() {  
  94.         sessionFactory.close() ;  
  95.     }  
  96.   
  97. }  

 以上则是单向和双向的一对多的配置与测试。下面是单向和双向的多对多的配置和测试。

 

------------------------------------------------------------------------------------------------------------------------------------

单向的多对多,实体类代码如下:

 

Java代码
  1. package cn.serup.model;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. import javax.persistence.Entity;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.Id;  
  9. import javax.persistence.JoinColumn;  
  10. import javax.persistence.JoinTable;  
  11. import javax.persistence.ManyToMany;  
  12.   
  13. @Entity  
  14. public class User {  
  15.       
  16.     private int id ;  
  17.       
  18.     private String username ;  
  19.       
  20.     private Set<Role> role = new HashSet<Role>() ;  
  21.   
  22.     @Id  
  23.     @GeneratedValue  
  24.     public int getId() {  
  25.         return id;  
  26.     }  
  27.   
  28.     public void setId(int id) {  
  29.         this.id = id;  
  30.     }  
  31.   
  32.     public String getUsername() {  
  33.         return username;  
  34.     }  
  35.   
  36.     public void setUsername(String username) {  
  37.         this.username = username;  
  38.     }  
  39.   
  40.     @ManyToMany  
  41.     /** 
  42.      * 多对多映射:注解@ManyToMany(单向) 
  43.      * 默认情况下,hibernate会自动的创建一张中间表, 
  44.      * 来维护多对多关系 
  45.      * 默认中间表的名称 :user_role中间表,字段的名称user_id role_id 
  46.      * 如果想更换表名和字段名称,注解如下: 
  47.      */  
  48.     @JoinTable(name="t_u_r",  
  49.             joinColumns={@JoinColumn(name="u_id")},  
  50.             inverseJoinColumns={@JoinColumn(name="r_id")}  
  51.     )  
  52.     public Set<Role> getRole() {  
  53.         return role;  
  54.     }  
  55.   
  56.     public void setRole(Set<Role> role) {  
  57.         this.role = role;  
  58.     }  
  59.   
  60.       
  61. }  

 

Java代码
  1. package cn.serup.model;  
  2.   
  3.   
  4. import javax.persistence.Entity;  
  5. import javax.persistence.GeneratedValue;  
  6. import javax.persistence.Id;  
  7.   
  8. @Entity  
  9. public class Role {  
  10.       
  11.     private int id ;  
  12.       
  13.     private String roleName ;  
  14.       
  15.     /*private Set<User> user = new HashSet<User>() ; 
  16.  
  17.     @ManyToMany 
  18.     public Set<User> getUser() { 
  19.         return user; 
  20.     } 
  21.  
  22.     public void setUser(Set<User> user) { 
  23.         this.user = user; 
  24.     }*/  
  25.   
  26.     @Id  
  27.     @GeneratedValue  
  28.     public int getId() {  
  29.         return id;  
  30.     }  
  31.   
  32.     public void setId(int id) {  
  33.         this.id = id;  
  34.     }  
  35.   
  36.     public String getRoleName() {  
  37.         return roleName;  
  38.     }  
  39.   
  40.     public void setRoleName(String roleName) {  
  41.         this.roleName = roleName;  
  42.     }  
  43.       
  44. }  

 测试类代码如下:

 

 

Java代码
  1. package cn.serup.hibernate.test;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Iterator;  
  5. import java.util.Set;  
  6.   
  7. import org.hibernate.Session;  
  8. import org.hibernate.SessionFactory;  
  9. import org.hibernate.cfg.AnnotationConfiguration;  
  10. import org.junit.AfterClass;  
  11. import org.junit.BeforeClass;  
  12. import org.junit.Test;  
  13.   
  14. import cn.serup.model.Role;  
  15. import cn.serup.model.User;  
  16.   
  17. public class Many2ManyTest {  
  18.       
  19.     private static SessionFactory sessionFactory = null ;  
  20.       
  21.     @Test  
  22.     public void testSaveUR() {  
  23.         Role r1 = new Role() ;  
  24.         r1.setRoleName("项目组长") ;  
  25.           
  26.         Role r3 = new Role() ;  
  27.         r3.setRoleName("项目经理") ;  
  28.           
  29.         Role r2 = new Role() ;  
  30.         r2.setRoleName("技术总监") ;  
  31.           
  32.           
  33.         User u1 = new User() ;  
  34.         u1.setUsername("唐骏") ;  
  35.   
  36.         User u2 = new User() ;  
  37.         u2.setUsername("李开复") ;  
  38.           
  39.         User u3 = new User() ;  
  40.         u3.setUsername("柳传志") ;  
  41.           
  42.         Set<Role> s1 = new HashSet<Role>() ;  
  43.         s1.add(r1) ;  
  44.         s1.add(r3) ;  
  45.           
  46.         Set<Role> s2 = new HashSet<Role>() ;  
  47.         s2.add(r1) ;  
  48.         s2.add(r2) ;  
  49.           
  50.         Set<Role> s3 = new HashSet<Role>() ;  
  51.         s3.add(r1) ;  
  52.         s3.add(r2) ;  
  53.         s3.add(r3) ;  
  54.           
  55.         u1.setRole(s1) ;  
  56.         u2.setRole(s2) ;  
  57.         u3.setRole(s3) ;  
  58.           
  59.         Session session = sessionFactory.getCurrentSession() ;  
  60.         session.beginTransaction().begin() ;  
  61.           
  62.         session.save(r1) ;  
  63.         session.save(r2) ;  
  64.         session.save(r3) ;  
  65.           
  66.         session.save(u1) ;  
  67.         session.save(u2) ;  
  68.         session.save(u3) ;  
  69.           
  70.         session.beginTransaction().commit() ;  
  71.     }  
  72.       
  73.     @Test  
  74.     public void testLoadUR() {  
  75.         Session session = sessionFactory.getCurrentSession() ;  
  76.         session.beginTransaction().begin() ;  
  77.           
  78.         User u = (User) session.get(User.class,3) ;  
  79.           
  80.         System.out.println("用户:"+u.getUsername()) ;  
  81.           
  82.         Set<Role> s1 = u.getRole() ;  
  83.         System.out.print("拥有职务:");  
  84.         for(Iterator<Role> it = s1.iterator(); it.hasNext();) {  
  85.             Role r = (Role) it.next() ;  
  86.             System.out.print("\t【"+r.getRoleName()+"】");  
  87.         }  
  88.           
  89.         session.beginTransaction().commit() ;  
  90.     }  
  91.       
  92.       
  93.     @BeforeClass  
  94.     public static void beforeClass() {  
  95.         sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory() ;  
  96.     }  
  97.       
  98.     @AfterClass  
  99.     public static void afterClass() {  
  100.         sessionFactory.close() ;  
  101.     }  
  102.   
  103. }  

 接下来是双向的多对多,实体类代码如下:

 

 

Java代码
  1. package cn.serup.model;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. import javax.persistence.Entity;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.Id;  
  9. import javax.persistence.JoinColumn;  
  10. import javax.persistence.JoinTable;  
  11. import javax.persistence.ManyToMany;  
  12.   
  13. @Entity  
  14. public class User {  
  15.       
  16.     private int id ;  
  17.       
  18.     private String username ;  
  19.       
  20.     private Set<Role> role = new HashSet<Role>() ;  
  21.   
  22.     @Id  
  23.     @GeneratedValue  
  24.     public int getId() {  
  25.         return id;  
  26.     }  
  27.   
  28.     public void setId(int id) {  
  29.         this.id = id;  
  30.     }  
  31.   
  32.     public String getUsername() {  
  33.         return username;  
  34.     }  
  35.   
  36.     public void setUsername(String username) {  
  37.         this.username = username;  
  38.     }  
  39.   
  40.     @ManyToMany  
  41.     /** 
  42.      * 多对多映射:注解@ManyToMany(单向) 
  43.      * 默认情况下,hibernate会自动的创建一张中间表, 
  44.      * 来维护多对多关系 
  45.      * 默认中间表的名称 :user_role中间表,字段的名称u_id r_id 
  46.      * 如果想更换表名和字段名称,注解如下: 
  47.      */  
  48.     @JoinTable(name="t_u_r",  
  49.             joinColumns={@JoinColumn(name="u_id")},  
  50.             inverseJoinColumns={@JoinColumn(name="r_id")}  
  51.     )  
  52.     /** 
  53.      * @JoinTable(name="t_u_r", 
  54.      * 指定中间表的表名 
  55.      * joinColumns={@JoinColumn(name="u_id")}, 
  56.      * 指定当前对象的外键 
  57.      * inverseJoinColumns={@JoinColumn(name="r_id")} 
  58.      * 指定关联对象的外键 
  59.      */  
  60.       
  61.     public Set<Role> getRole() {  
  62.         return role;  
  63.     }  
  64.   
  65.     public void setRole(Set<Role> role) {  
  66.         this.role = role;  
  67.     }  
  68.   
  69.       
  70. }  

 

Java代码
  1. package cn.serup.model;  
  2.   
  3.   
  4. import java.util.HashSet;  
  5. import java.util.Set;  
  6.   
  7. import javax.persistence.Entity;  
  8. import javax.persistence.GeneratedValue;  
  9. import javax.persistence.Id;  
  10. import javax.persistence.ManyToMany;  
  11.   
  12. @Entity  
  13. public class Role {  
  14.       
  15.     private int id ;  
  16.       
  17.     private String roleName ;  
  18.       
  19.     private Set<User> user = new HashSet<User>() ;  
  20.   
  21.     @ManyToMany(mappedBy="role")  
  22.     /** 
  23.      * 多对多,双向关联映射  
  24.      */  
  25.     public Set<User> getUser() {  
  26.         return user;  
  27.     }  
  28.   
  29.     public void setUser(Set<User> user) {  
  30.         this.user = user;  
  31.     }  
  32.   
  33.     @Id  
  34.     @GeneratedValue  
  35.     public int getId() {  
  36.         return id;  
  37.     }  
  38.   
  39.     public void setId(int id) {  
  40.         this.id = id;  
  41.     }  
  42.   
  43.     public String getRoleName() {  
  44.         return roleName;  
  45.     }  
  46.   
  47.     public void setRoleName(String roleName) {  
  48.         this.roleName = roleName;  
  49.     }  
  50.       
  51. }  

 测试代码如下:

 

 

Java代码
  1. package cn.serup.hibernate.test;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Iterator;  
  5. import java.util.Set;  
  6.   
  7. import org.hibernate.Session;  
  8. import org.hibernate.SessionFactory;  
  9. import org.hibernate.cfg.AnnotationConfiguration;  
  10. import org.junit.AfterClass;  
  11. import org.junit.BeforeClass;  
  12. import org.junit.Test;  
  13.   
  14. import cn.serup.model.Role;  
  15. import cn.serup.model.User;  
  16.   
  17. public class Many2ManyTest {  
  18.       
  19.     private static SessionFactory sessionFactory = null ;  
  20.       
  21.     public void testSaveUR() {  
  22.         Role r1 = new Role() ;  
  23.         r1.setRoleName("项目组长") ;  
  24.           
  25.         Role r3 = new Role() ;  
  26.         r3.setRoleName("项目经理") ;  
  27.           
  28.         Role r2 = new Role() ;  
  29.         r2.setRoleName("技术总监") ;  
  30.           
  31.           
  32.         User u1 = new User() ;  
  33.         u1.setUsername("唐骏") ;  
  34.   
  35.         User u2 = new User() ;  
  36.         u2.setUsername("李开复") ;  
  37.           
  38.         User u3 = new User() ;  
  39.         u3.setUsername("柳传志") ;  
  40.           
  41.         Set<Role> s1 = new HashSet<Role>() ;  
  42.         s1.add(r1) ;  
  43.         s1.add(r3) ;  
  44.           
  45.         Set<Role> s2 = new HashSet<Role>() ;  
  46.         s2.add(r1) ;  
  47.         s2.add(r2) ;  
  48.           
  49.         Set<Role> s3 = new HashSet<Role>() ;  
  50.         s3.add(r1) ;  
  51.         s3.add(r2) ;  
  52.         s3.add(r3) ;  
  53.           
  54.         u1.setRole(s1) ;  
  55.         u2.setRole(s2) ;  
  56.         u3.setRole(s3) ;  
  57.           
  58.         Session session = sessionFactory.getCurrentSession() ;  
  59.         session.beginTransaction().begin() ;  
  60.           
  61.         session.save(r1) ;  
  62.         session.save(r2) ;  
  63.         session.save(r3) ;  
  64.           
  65.         session.save(u1) ;  
  66.         session.save(u2) ;  
  67.         session.save(u3) ;  
  68.           
  69.         session.beginTransaction().commit() ;  
  70.     }  
  71.       
  72.     @Test  
  73.     public void testLoadUR() {  
  74.         Session session = sessionFactory.getCurrentSession() ;  
  75.         session.beginTransaction().begin() ;  
  76.           
  77.         User u = (User) session.get(User.class,3) ;  
  78.           
  79.         System.out.println("用户:"+u.getUsername()) ;  
  80.           
  81.         Set<Role> s1 = u.getRole() ;  
  82.         System.out.print("拥有职务:");  
  83.         for(Iterator<Role> it = s1.iterator(); it.hasNext();) {  
  84.             Role r = (Role) it.next() ;  
  85.             System.out.print("\t【"+r.getRoleName()+"】");  
  86.         }  
  87.           
  88.         session.beginTransaction().commit() ;  
  89.     }  
  90.       
  91.     @Test  
  92.     public void testLoadRU() {  
  93.         Session session = sessionFactory.getCurrentSession() ;  
  94.         session.beginTransaction().begin() ;  
  95.           
  96.         Role r = (Role) session.get(Role.class,1) ;  
  97.           
  98.         System.out.println("职务:"+r.getRoleName()) ;  
  99.           
  100.         Set<User> s1 = r.getUser() ;  
  101.         System.out.print("谁拥有该职务:");  
  102.         for(Iterator<User> it = s1.iterator(); it.hasNext();) {  
  103.             User u = (User) it.next() ;  
  104.             System.out.print("\t【"+u.getUsername()+"】");  
  105.         }  
  106.           
  107.         session.beginTransaction().commit() ;  
  108.     }  
  109.       
  110.       
  111.     @BeforeClass  
  112.     public static void beforeClass() {  
  113.         sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory() ;  
  114.     }  
  115.       
  116.     @AfterClass  
  117.     public static void afterClass() {  
  118.         sessionFactory.close() ;  
  119.     }  
  120.   
  121. }  

 以上,就是双向的多对多的配置和测试。还有的,就是一些别的属性的配置,如级联啊,fetch策略之类的。

 

 

级联(cascade)属性
1、CascadeType.ALL(包括增、删、改、查,联动操作),其实查不算在内,查Fetch
2、CascadeType.MERGE(合并的join)--不重要
3、CascadeType.PERSIST(保存的时候在级联)
4、CascadeType.REFRESH(刷新说明:比如现在我查询出了数据,另外一个人在我查询数据之后,他对数据做了修改,这是才会级联上,hibernate会自动刷新我查询出来的数据)
5、CascadeType.REMOVE (只要在删除操作时才会级联)
6、我们一般都只设置CascadeType.ALL就OK了,
7、Cascade不是必须的,他的作用只是可以让我们快速的开发,我们也可以通过手动增、删、改、查

Fetch捉取策略
1、FetchType.EAGER(渴望的,希望马上得到)
a)    一对多关系,比如通过get()方法来get出一的一端,他只会出一条SQL语句,不会自动去查询多的一端,如果设置FetchType.EAGER,会讲他的关联对象查询出来
b)    如果是load的话,他不会发出SQL语句,因为load支持延迟加载,只有真正获取数据时才会发SQL
2、FetchType.LAZY(懒加载)
a)    只有真正获取数据时才发出SQL语句
3、默认是:FetchType.LAZY(一对多)
4、默认是:FetchType.EAGER(多对一)
5、一般使用默认就可以了

原创粉丝点击