分享

Hibernate4一对多关系映射(自身关联)

 贾朋亮博客 2015-05-04

示例:一个类别(Category)下面有多个子类别,多个子类别属于同一个父类别。

Java代码 复制代码 收藏代码
  1. public class Category  {   
  2.   
  3.     private Integer id;   
  4.     private String name;   
  5.     private Category parentCategory; // 父类别   
  6.     private Set<Category> childCategories = new HashSet<Category>(); // 子类别   
  7.   
  8.     // getter and setter   
  9. }  

 用XML映射

Xml代码 复制代码 收藏代码
  1. <hibernate-mapping package="org.monday.hibernate4.domain">  
  2.     <class name="Category" table="tbl_category">  
  3.         <id name="id">  
  4.             <generator class="identity" />  
  5.         </id>  
  6.         <property name="name" />  
  7.         <many-to-one name="parentCategory" class="Category" column="category_id" />  
  8.         <set name="childCategories" inverse="true" cascade="all">  
  9.             <key column="category_id" />  
  10.             <one-to-many class="Category" />  
  11.         </set>  
  12.     </class>  
  13. </hibernate-mapping>  

 用@Annotation映射

 

Java代码 复制代码 收藏代码
  1. @Entity  
  2. @Table(name = "tbl_category")   
  3. public class Category  {   
  4.   
  5.     @Id  
  6.     @GeneratedValue(strategy = GenerationType.IDENTITY)   
  7.     private Integer id;   
  8.     private String name;   
  9.   
  10.     @ManyToOne  
  11.     @JoinColumn(name = "category_id")   
  12.     private Category parentCategory; // 父类别   
  13.   
  14.     @OneToMany(mappedBy = "parentCategory", targetEntity = Category.class, cascade = CascadeType.ALL)   
  15.     private Set<Category> childCategories = new HashSet<Category>(); // 子类别   
  16.   
  17.     //getter and setter   
  18. }  

 

测试代码

Java代码 复制代码 收藏代码
  1.                      Category foodCategory = new Category("food");   
  2. Category fruitCategory = new Category("fruit");   
  3. Category vegetableCategory = new Category("vegetable");   
  4. Category appleCategory = new Category("apple");   
  5. Category orangeCategory = new Category("orange");   
  6. Category tomatoCategory = new Category("tomato");   
  7.   
  8. // 建立食品类别和水果类别之间的关联关系   
  9. foodCategory.getChildCategories().add(fruitCategory);   
  10. fruitCategory.setParentCategory(foodCategory);   
  11.   
  12. // 建立食品类别和蔬菜类别之间的关联关系   
  13. foodCategory.getChildCategories().add(vegetableCategory);   
  14. vegetableCategory.setParentCategory(foodCategory);   
  15.   
  16. // 建立水果类别和苹果类别之间的关联关系   
  17. fruitCategory.getChildCategories().add(appleCategory);   
  18. appleCategory.setParentCategory(fruitCategory);   
  19.   
  20. // 建立水果类别和桔子类别之间的关联关系   
  21. fruitCategory.getChildCategories().add(orangeCategory);   
  22. orangeCategory.setParentCategory(fruitCategory);   
  23.   
  24. // 建立西红柿类别和蔬菜类别之间的关联关系   
  25. tomatoCategory.setParentCategory(vegetableCategory);   
  26. vegetableCategory.getChildCategories().add(tomatoCategory);   
  27.   
  28. session.save(foodCategory);  

 SQL schema

Sql代码 复制代码 收藏代码
  1. Hibernate:    
  2.     create table CATEGORYS (   
  3.         id integer not null,   
  4.         name varchar(255),   
  5.         category_id bigint,   
  6.         primary key (id)   
  7.     )   
  8. Hibernate:    
  9.     alter table CATEGORYS    
  10.         add index FK36CF3159B3B4FFA (category_id),    
  11.         add constraint FK36CF3159B3B4FFA    
  12.         foreign key (category_id)    
  13.         references CATEGORYS (id)  

 

-----------------------------改进代码---------------------------

 

1.改进实体类

Java代码 复制代码 收藏代码
  1. @Entity  
  2. @Table(name = "tbl_category")   
  3. public class Category {   
  4.   
  5.     @Id  
  6.     @GeneratedValue(strategy = GenerationType.IDENTITY)   
  7.     private Integer id;   
  8.     private String name;   
  9.   
  10.     @ManyToOne  
  11.     @JoinColumn(name = "category_id")   
  12.     private Category parentCategory; // 父类别   
  13.   
  14.     @OneToMany(mappedBy = "parentCategory", targetEntity = Category.class, cascade = CascadeType.ALL)   
  15.     private Set<Category> childCategories = new HashSet<Category>(); // 子类别   
  16.   
  17.     //getter and setter   
  18.   
  19.     /** 添加子类别 */  
  20.     public void addChildCategory(Category category) {   
  21.         if (category == null) {   
  22.             throw new IllegalArgumentException("Can't add a null Category as child.");   
  23.         }   
  24.         // 删除旧的父类别Category   
  25.         if (category.getParentCategory() != null) {   
  26.             category.getParentCategory().getChildCategories().remove(category);   
  27.         }   
  28.         // 设置新的父类别Category   
  29.         category.setParentCategory(this);   
  30.         // 向当前Category对象中加入子类别   
  31.         this.getChildCategories().add(category);   
  32.     }   
  33. }  

 

2.测试代码

Java代码 复制代码 收藏代码
  1. // 建立食品类别和水果类别之间的关联关系   
  2.             foodCategory.addChildCategory(fruitCategory);   
  3.   
  4.             // 建立食品类别和蔬菜类别之间的关联关系   
  5.             foodCategory.addChildCategory(vegetableCategory);   
  6.   
  7.             // 建立水果类别和苹果类别之间的关联关系   
  8.             fruitCategory.addChildCategory(appleCategory);   
  9.   
  10.             // 建立水果类别和桔子类别之间的关联关系   
  11.             fruitCategory.addChildCategory(orangeCategory);   
  12.   
  13.             // 建立西红柿类别和蔬菜类别之间的关联关系   
  14.             vegetableCategory.addChildCategory(tomatoCategory);   
  15.   
  16.             session.save(foodCategory);  

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多