zoukankan      html  css  js  c++  java
  • hibernate关系映射学习小结

    一、一对多映射(one-to-many)

    hibernateXML配置文件:

     1 <!DOCTYPE hibernate-configuration PUBLIC
     2     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     3     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     4 
     5 <hibernate-configuration>
     6 <session-factory>
     7     <!-- 配置连接目标数据库的属性 -->
     8     <property name="connection.driver_class">
     9         oracle.jdbc.OracleDriver
    10     </property>
    11     <property name="connection.url">
    12         jdbc:oracle:thin:@127.0.0.1:1521:xe
    13     </property>
    14     <property name="connection.username">etc1616</property>
    15     <property name="connection.password">123</property>
    16 
    17     <!-- 配置方言 -->
    18     <property name="dialect">
    19         org.hibernate.dialect.Oracle10gDialect
    20     </property>
    21 
    22     <!-- 是否要显示Hibernate生成的sql语句 -->
    23     <property name="show_sql">true</property>
    24     <!-- 是否要格式化显示出的SQL -->
    25     <property name="format_sql">true</property>
    26 
    27     <!-- 打开自动创建DDL -->
    28      <property name="hbm2ddl.auto">update</property> 
    29 
    30     <!-- 配置C3P0连接池组件 
    31     <property name="c3p0.max_size">5</property>
    32     <property name="c3p0.min_size">2</property>
    33     <property name="c3p0.timeout">5000</property>
    34     <property name="c3p0.idle_test_period">3000</property>
    35     <property name="c3p0.acquire_increment">1</property>
    36     <property name="c3p0.max_statements">150</property>
    37     -->
    38     <!-- 开启二级缓存 
    39     <property name="cache.use_second_level_cache">true</property>-->
    40     <!-- 指定二级缓存供应商 
    41     <property name="cache.region.factory_class">
    42         org.hibernate.cache.ehcache.EhCacheRegionFactory
    43     </property>
    44     -->
    45     
    46 
    47     <!-- 开启查询缓存 
    48     <property name="cache.use_query_cache">true</property>-->
    49     <!-- 读取映射文件 -->
    50     <!--<mapping resource="com/hbm/entity/Account.hbm.xml" />-->
    51     <!-- <mapping resource="com/hbm/entity/Student.hbm.xml" />
    52     <mapping resource="com/hbm/entity/Class.hbm.xml" /> -->
    53     <!-- 读取实体 -->
    54     <!-- <mapping class="com.hbm.entity.Book" />
    55     <mapping class="com.hbm.entity.BookInfo" />
    56     <mapping class="com.hbm.entity.Customer" />
    57     <mapping class="com.hbm.entity.Order" /> 
    58     <mapping class="com.hbm.entity.Role" />
    59     <mapping class="com.hbm.entity.User" />-->
    60     <mapping class="com.hbm.entity.Category" /> 
    61     <mapping class="com.hbm.entity.Product" />
    62     <!-- <mapping class="com.hbm.entity.User" />
    63     <mapping class="com.hbm.entity.Role" /> -->
    64     
    65 </session-factory>
    66 </hibernate-configuration>

    Product类:

     1 package com.hbm.entity;
     2 
     3 import javax.persistence.Column;
     4 import javax.persistence.Entity;
     5 import javax.persistence.FetchType;
     6 import javax.persistence.GeneratedValue;
     7 import javax.persistence.Id;
     8 import javax.persistence.JoinColumn;
     9 import javax.persistence.ManyToOne;
    10 import javax.persistence.Table;
    11 import org.hibernate.annotations.GenericGenerator;
    12 
    13 
    14 @Entity
    15 @Table(name = "product")
    16 public class Product {
    17 
    18       private Integer id;
    19       private Category category;
    20       private String name;
    21       private String price;
    22       private String descripton;
    23         
    24      
    25      public Product() {
    26          // TODO Auto-generated constructor stub
    27      }
    28     
    29      public Product(Category category, String name, String price,String descripton) {
    30           this.category = category;
    31           this.name = name;
    32           this.price = price;
    33           this.descripton = descripton;
    34           
    35      }
    36      
    37      @Id
    38      @GenericGenerator(name = "generator", strategy = "increment")
    39      @GeneratedValue(generator = "generator")
    40      @Column(name = "id", unique = true, nullable = false)
    41      public Integer getId() {
    42          return this.id;
    43      }
    44     
    45      public void setId(Integer id) {
    46          this.id = id;
    47       
    48      }
    49     
    50      //延迟加载:多对一方式
    51      //关联信息:外键name = "category_id"
    52      @ManyToOne(fetch = FetchType.LAZY)
    53      @JoinColumn(name = "category_id")
    54      public Category getCategory() {
    55          return this.category;
    56      }
    57     
    58      public void setCategory(Category category) {
    59          this.category = category;
    60      }
    61     
    62      @Column(name = "name", length = 500)
    63      public String getName() {
    64          return this.name;
    65      }
    66     
    67      public void setName(String name) {
    68          this.name = name;
    69      }
    70     
    71      @Column(name = "price", length = 10)
    72      public String getPrice() {
    73          return this.price;
    74      }
    75     
    76      public void setPrice(String price) {
    77          this.price = price;
    78      }
    79     
    80      @Column(name = "descripton", length = 500)
    81      public String getDescripton() {
    82          return this.descripton;
    83      }
    84     
    85      public void setDescripton(String descripton) {
    86          this.descripton = descripton;
    87       
    88      }
    89 
    90     @Override
    91     public String toString() {
    92         return "Product [id=" + id + ", category=" + category + ", name="
    93                 + name + ", price=" + price + ", descripton=" + descripton
    94                 + "]";
    95     }
    96      
    97 
    98 }

    Category类:

     1 package com.hbm.entity;
     2 
     3 import java.util.HashSet;
     4 import java.util.Set;
     5 import javax.persistence.CascadeType;
     6 import javax.persistence.Column;
     7 import javax.persistence.Entity;
     8 import javax.persistence.FetchType;
     9 import javax.persistence.GeneratedValue;
    10 import javax.persistence.Id;
    11 import javax.persistence.OneToMany;
    12 import javax.persistence.Table;
    13 import org.hibernate.annotations.GenericGenerator;
    14 
    15     
    16 @Entity
    17 @Table(name = "category")
    18 public class Category{
    19 
    20     private Integer id;
    21     private String name;
    22     private String description;
    23     private Set<Product> products = new HashSet<Product>();
    24 
    25      public Category() {
    26          
    27      }
    28 
    29      public Category(String name, String description, Set<Product> products) {
    30          this.name = name;
    31          this.description = description;
    32          this.products = products;
    33          
    34      }
    35 
    36      //主键 :@Id 主键生成方式:strategy = "increment"
    37      //映射表中id这个字段,不能为空,并且是唯一的
    38      @Id
    39      @GenericGenerator(name = "generator", strategy = "increment")
    40      @GeneratedValue(generator = "generator")
    41      @Column(name = "id", unique = true, nullable = false)
    42      public Integer getId() {
    43          return this.id;
    44      }
    45 
    46      public void setId(Integer id) {
    47          this.id = id;
    48      }
    49 
    50      //映射表中name这个字段 ,长度是500
    51      @Column(name = "name", length = 500)
    52      public String getName() {
    53          return this.name;
    54      }
    55 
    56      public void setName(String name) {
    57          this.name = name;
    58      }
    59      
    60      //映射表中description这个字段 ,长度是500
    61      @Column(name = "description", length = 500)
    62      public String getDescription() {
    63          return this.description;
    64      }
    65 
    66      public void setDescription(String description) {
    67          this.description = description;
    68      }
    69 
    70      //级联操作:cascade = CascadeType.ALL
    71      //延迟加载:fetch = FetchType.LAZY
    72      //映射:mappedBy = "category"
    73      //一对多方式
    74      @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "category")
    75      public Set<Product> getProducts() {
    76          return this.products;
    77      }
    78 
    79      public void setProducts(Set<Product> products) {
    80          this.products = products;
    81      }
    82 
    83     @Override
    84     public String toString() {
    85         return "Category [id=" + id + ", name=" + name + ", description="
    86                 + description + "]";
    87     }
    88      
    89 
    90 }

     测试类:

     1 package com.hbm.test;
     2 
     3 import java.util.Set;
     4 
     5 import org.hibernate.Session;
     6 import org.hibernate.SessionFactory;
     7 import org.hibernate.Transaction;
     8 import org.junit.Test;
     9 import com.hbm.Util.HibernateUtil;
    10 import com.hbm.entity.Category;
    11 import com.hbm.entity.Product;
    12 
    13 public class Category_Test {
    14     
    15     
    16     SessionFactory sf=HibernateUtil.getSessionFactory();
    17     Session session=sf.openSession();
    18     Transaction ts=session.beginTransaction();
    19     
    20     @Test
    21     public void test1(){
    22         
    23         Product p=new Product();
    24         p.setName("大语文");
    25         p.setPrice("123");
    26         p.setDescripton("编程语言");
    27         
    28         
    29         Category c=new Category();
    30         c.setId(1);
    31         c.setName("李四");
    32         c.setDescription("ok");
    33         
    34         //建立双向关联
    35     
    36         c.getProducts().add(p);
    37         p.setCategory(c);
    38         
    39         session.save(c);
    40         
    41         ts.commit();
    42         session.close();
    43         
    44         
    45     }
    46     
    47     
    48     @Test
    49     public void test2(){
    50         
    51         Category c=(Category)session.get(Category.class, 1);
    52         Set<Product> p=c.getProducts();
    53         for(Product product:p){
    54             System.out.println(product);
    55         }
    56         System.out.println(c);
    57         ts.commit();
    58         
    59     }
    60 
    61              
    62 }

    三、多对多映射(many-to-many)

    hibernateXML配置文件:

     1 <!DOCTYPE hibernate-configuration PUBLIC
     2     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     3     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     4 
     5 <hibernate-configuration>
     6 <session-factory>
     7     <!-- 配置连接目标数据库的属性 -->
     8     <property name="connection.driver_class">
     9         oracle.jdbc.OracleDriver
    10     </property>
    11     <property name="connection.url">
    12         jdbc:oracle:thin:@127.0.0.1:1521:xe
    13     </property>
    14     <property name="connection.username">etc1616</property>
    15     <property name="connection.password">123</property>
    16 
    17     <!-- 配置方言 -->
    18     <property name="dialect">
    19         org.hibernate.dialect.Oracle10gDialect
    20     </property>
    21 
    22     <!-- 是否要显示Hibernate生成的sql语句 -->
    23     <property name="show_sql">true</property>
    24     <!-- 是否要格式化显示出的SQL -->
    25     <property name="format_sql">true</property>
    26 
    27     <!-- 打开自动创建DDL -->
    28      <property name="hbm2ddl.auto">update</property> 
    29 
    30     <!-- 配置C3P0连接池组件 
    31     <property name="c3p0.max_size">5</property>
    32     <property name="c3p0.min_size">2</property>
    33     <property name="c3p0.timeout">5000</property>
    34     <property name="c3p0.idle_test_period">3000</property>
    35     <property name="c3p0.acquire_increment">1</property>
    36     <property name="c3p0.max_statements">150</property>
    37     -->
    38     <!-- 开启二级缓存 
    39     <property name="cache.use_second_level_cache">true</property>-->
    40     <!-- 指定二级缓存供应商 
    41     <property name="cache.region.factory_class">
    42         org.hibernate.cache.ehcache.EhCacheRegionFactory
    43     </property>
    44     -->
    45     
    46 
    47     <!-- 开启查询缓存 
    48     <property name="cache.use_query_cache">true</property>-->
    49     <!-- 读取映射文件 -->
    50     <!--<mapping resource="com/hbm/entity/Account.hbm.xml" />-->
    51     <!-- <mapping resource="com/hbm/entity/Student.hbm.xml" />
    52     <mapping resource="com/hbm/entity/Class.hbm.xml" /> -->
    53     <!-- 读取实体 -->
    54     <!-- <mapping class="com.hbm.entity.Book" />
    55     <mapping class="com.hbm.entity.BookInfo" />
    56     <mapping class="com.hbm.entity.Customer" />
    57     <mapping class="com.hbm.entity.Order" /> 
    58     <mapping class="com.hbm.entity.Role" />
    59     <mapping class="com.hbm.entity.User" />-->
    60     <mapping class="com.hbm.entity.User" />
    61     <mapping class="com.hbm.entity.Role" />
    62     
    63 </session-factory>
    64 </hibernate-configuration>

    User类:

     1 package com.hbm.entity;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 import javax.persistence.Entity;
     6 import javax.persistence.GeneratedValue;
     7 import javax.persistence.Id;
     8 import javax.persistence.JoinColumn;
     9 import javax.persistence.JoinTable;
    10 import javax.persistence.ManyToMany;
    11 
    12 @Entity(name="hbl_user")
    13 public class User {
    14     
    15     private int user_id;
    16     private String user_name;
    17     private List<Role> rs_id=new ArrayList<Role>();
    18     
    19     
    20     public User() {
    21         // TODO Auto-generated constructor stub
    22     }
    23 
    24 
    25     public User(int user_id, String user_name, List<Role> rs_id) {
    26         super();
    27         this.user_id = user_id;
    28         this.user_name = user_name;
    29         this.rs_id = rs_id;
    30     }
    31 
    32     @Id
    33     @GeneratedValue
    34     public int getUser_id() {
    35         return user_id;
    36     }
    37 
    38 
    39     public void setUser_id(int user_id) {
    40         this.user_id = user_id;
    41     }
    42 
    43     @JoinColumn
    44     public String getUser_name() {
    45         return user_name;
    46     }
    47 
    48 
    49     public void setUser_name(String user_name) {
    50         this.user_name = user_name;
    51     }
    52 
    53     @ManyToMany()
    54     @JoinTable(
    55         //中间表的自定义列名,与之相对应的关联表的主键名
    56         joinColumns=@JoinColumn(name="user_id",referencedColumnName="user_id"),
    57         //中间表的自定义列名,与之相对应的关联表的主键名
    58         inverseJoinColumns=@JoinColumn(name="role_id",referencedColumnName="role_id")
    59     )
    60     public List<Role> getRs_id() {
    61         return rs_id;
    62     }
    63 
    64 
    65     public void setRs_id(List<Role> rs_id) {
    66         this.rs_id = rs_id;
    67     }
    68     
    69     
    70 }

    Role类:

     1 package com.hbm.entity;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import javax.persistence.Column;
     7 import javax.persistence.Entity;
     8 import javax.persistence.GeneratedValue;
     9 import javax.persistence.Id;
    10 import javax.persistence.ManyToMany;
    11 
    12 
    13 @Entity(name="hbl_role")
    14 public class Role {
    15     
    16     private  int role_id;
    17     private String role_name;
    18     private  double price;
    19     private List<User> us_id=new ArrayList<User>();
    20     
    21     public Role() {
    22         // TODO Auto-generated constructor stub
    23     }
    24 
    25     public Role(int role_id, String role_name, double price, List<User> us_id) {
    26         super();
    27         this.role_id = role_id;
    28         this.role_name = role_name;
    29         this.price = price;
    30         this.us_id = us_id;
    31     }
    32     
    33     @Id
    34     @GeneratedValue
    35     public int getRole_id() {
    36         return role_id;
    37     }
    38 
    39     public void setRole_id(int role_id) {
    40         this.role_id = role_id;
    41     }
    42     
    43     @Column
    44     public String getRole_name() {
    45         return role_name;
    46     }
    47 
    48     public void setRole_name(String role_name) {
    49         this.role_name = role_name;
    50     }
    51 
    52     @Column
    53     public double getPrice() {
    54         return price;
    55     }
    56 
    57     public void setPrice(double price) {
    58         this.price = price;
    59     }
    60 
    61     @ManyToMany
    62     public List<User> getUs_id() {
    63         return us_id;
    64     }
    65 
    66     public void setUs_id(List<User> us_id) {
    67         this.us_id = us_id;
    68     }
    69     
    70     
    71     
    72     
    73     
    74 }

    测试类:

      1 package com.hbm.test;
      2 
      3 import java.util.Iterator;
      4 import org.hibernate.Session;
      5 import org.hibernate.SessionFactory;
      6 import org.hibernate.Transaction;
      7 import org.junit.Test;
      8 import com.hbm.Util.HibernateUtil;
      9 import com.hbm.entity.Role;
     10 import com.hbm.entity.User;
     11 
     12 public class User_Test {
     13 
     14     SessionFactory sf=HibernateUtil.getSessionFactory();
     15     Session session=sf.openSession();
     16     Transaction ts=session.beginTransaction();
     17     
     18     
     19     //插入数据
     20     @Test
     21     public void test1(){
     22         
     23         User u1=new User();
     24         u1.setUser_name("乔峰");
     25 
     26         User u2=new User();
     27         u2.setUser_name("段誉");
     28         
     29         
     30         Role c1=new Role();
     31         c1.setRole_name("丐帮帮主");
     32         c1.setPrice(100.0);
     33     
     34         Role c2=new Role();
     35         c2.setRole_name("大理王子");
     36         c2.setPrice(200.0);
     37 
     38         Role c3=new Role();
     39         c3.setRole_name("武林高手");
     40         c3.setPrice(300.0);
     41     
     42         u1.getRs_id().add(c1);
     43         u1.getRs_id().add(c3);
     44         
     45         u2.getRs_id().add(c1);
     46         u2.getRs_id().add(c2);
     47         u2.getRs_id().add(c3);
     48         
     49         c1.getUs_id().add(u1);
     50         c3.getUs_id().add(u2);
     51         
     52     
     53         session.save(u1);
     54         session.save(u2);
     55         
     56         session.save(c1);
     57         session.save(c2);
     58         session.save(c3);
     59         
     60         ts.commit();
     61         session.close();
     62         
     63         
     64     }
     65     
     66     //查询
     67     @Test
     68     public void test2(){
     69         
     70         User us =(User) session.get(User.class, 2);
     71         System.out.println("我的名字是:"+us.getUser_name());
     72         System.out.println("我的角色是:");
     73         Iterator<Role> it = us.getRs_id().iterator();
     74         while(it.hasNext()){
     75             System.out.println(it.next().getRole_name());    
     76         }
     77         
     78         ts.commit();
     79         session.close();
     80         
     81     }
     82     //删除
     83     @Test
     84     public void test3(){
     85         
     86         User us =(User) session.get(User.class, 1);
     87         Role rs =(Role) session.get(Role.class, 3);
     88         
     89         us.getRs_id().remove(rs);
     90         rs.getUs_id().remove(us);
     91         
     92         ts.commit();
     93         session.close();
     94         
     95         
     96     }
     97     //更新
     98     @Test
     99     public void test4(){
    100         
    101         User us =(User) session.get(User.class, 2);
    102         Role rs1 =(Role) session.get(Role.class, 3);
    103         Role rs2 =(Role) session.get(Role.class, 4);
    104         
    105         
    106         us.getRs_id().remove(rs1);
    107         rs1.getUs_id().remove(us);
    108         
    109         
    110         us.getRs_id().add(rs2);
    111         rs2.getUs_id().add(us);
    112         
    113         
    114         ts.commit();    
    115         session.close();
    116         
    117         
    118     }
    119     
    120     
    121 }

     

  • 相关阅读:
    Envoy
    Redis 使用总结
    kafka(一)
    docker搭建kafka环境&&Golang生产和消费
    docker-composer +Grafana+Prometheus系统监控之Redis
    Docker基础命令
    connection pool exhausted
    golang 单元测试&&性能测试
    golang http 中间件
    golang 函数的特殊用法
  • 原文地址:https://www.cnblogs.com/0lxp/p/5913785.html
Copyright © 2011-2022 走看看