hibernate多对多注解配置

hibernate多对多注解配置

 

上一篇文章主要讲解了Hibernate多对多配置文件的配置方法,接下来继续讲解注解方式配置多对多关系的方法。注解功能已经加入hibernate4之中了,但hibernate3要使用注解配置还需要另外引入jar包。

需要的jar包可见附件:


 

接下来开始进入正题:

一、第一种直接配置多对多关系,以Role角色-Right权限为例。

 

Role类代码   收藏代码
  1. import java.util.Date;  
  2. import java.util.List;  
  3. import javax.persistence.*;  
  4. import org.hibernate.annotations.GenericGenerator;  
  5.   
  6. @Entity  
  7. @Table(name="SYS_ROLE")   
  8. public class Role{  
  9.   
  10.   
  11.     private String role_id;  
  12.     private String role_name;  
  13.     private Date cre_time;  
  14.     private String parent_id;  
  15.     private String describe;  
  16.     private int sort;  
  17.       
  18.     private List<Right> rights;  
  19.       
  20.     @Id  
  21.     @GeneratedValue(generator = "paymentableGenerator")    
  22.     @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")  
  23.     public String getRole_id() {  
  24.         return role_id;  
  25.     }  
  26.     public void setRole_id(String roleId) {  
  27.         role_id = roleId;  
  28.     }  
  29.     @Column(name="role_name")  
  30.     public String getRole_name() {  
  31.         return role_name;  
  32.     }  
  33.     public void setRole_name(String roleName) {  
  34.         role_name = roleName;  
  35.     }  
  36.     @Column(name="cre_time")  
  37.     public Date getCre_time() {  
  38.         return cre_time;  
  39.     }  
  40.     public void setCre_time(Date creTime) {  
  41.         cre_time = creTime;  
  42.     }  
  43.     @Column(name="parent_id")  
  44.     public String getParent_id() {  
  45.         return parent_id;  
  46.     }  
  47.     public void setParent_id(String parentId) {  
  48.         parent_id = parentId;  
  49.     }  
  50.     @Column(name="describe")  
  51.     public String getDescribe() {  
  52.         return describe;  
  53.     }  
  54.     public void setDescribe(String describe) {  
  55.         this.describe = describe;  
  56.     }  
  57.     @Column(name="sort")  
  58.     public int getSort() {  
  59.         return sort;  
  60.     }  
  61.     public void setSort(int sort) {  
  62.         this.sort = sort;  
  63.     }  
  64.         //多对多映射  
  65.     @ManyToMany(targetEntity = Right.class, fetch = FetchType.LAZY)    
  66.     @JoinTable(name = "ROLE_RIGHT", joinColumns = @JoinColumn(name = "ROLE_ID"), inverseJoinColumns = @JoinColumn(name = "RIGHT_ID"))    
  67.     public List<Right> getRights() {  
  68.         return rights;  
  69.     }  
  70.     public void setRights(List<Right> rights) {  
  71.         this.rights = rights;  
  72.     }  
  73.     @Override  
  74.     public String toString() {  
  75.         return "Role [cre_time=" + cre_time + ", describe=" + describe  
  76.                 + ", parent_id=" + parent_id + ", role_id=" + role_id  
  77.                 + ", role_name=" + role_name + ", sort=" + sort + "]";  
  78.     }  
  79.       
  80.           
  81.           
  82.           
  83. }  

 
 

Right类代码   收藏代码
  1. import java.util.List;  
  2. import javax.persistence.*;  
  3. import org.hibernate.annotations.GenericGenerator;  
  4.   
  5. @Entity  
  6. @Table(name="SYS_RIGHTS")  
  7. public class Right{  
  8.   
  9.   
  10.     private String right_id;  
  11.     private String right_name;  
  12.     private String url;  
  13.     private String parent_id;  
  14.     private int lev;  
  15.     private int sort;  
  16.       
  17.     private List<Role> roles;  
  18.   
  19.     @Id  
  20.     @GeneratedValue(generator = "paymentableGenerator")    
  21.     @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")  
  22.     public String getRight_id() {  
  23.         return right_id;  
  24.     }  
  25.     public void setRight_id(String rightId) {  
  26.         right_id = rightId;  
  27.     }  
  28.   
  29.     @Column(name="right_name")  
  30.     public String getRight_name() {  
  31.         return right_name;  
  32.     }  
  33.     public void setRight_name(String rightName) {  
  34.         right_name = rightName;  
  35.     }  
  36.     @Column(name="url")  
  37.     public String getUrl() {  
  38.         return url;  
  39.     }  
  40.     public void setUrl(String url) {  
  41.         this.url = url;  
  42.     }  
  43.   
  44.     @Column(name="parent_id")  
  45.     public String getParent_id() {  
  46.         return parent_id;  
  47.     }  
  48.     public void setParent_id(String parentId) {  
  49.         parent_id = parentId;  
  50.     }     
  51.     @Column(name="lev")  
  52.     public int getLev() {  
  53.         return lev;  
  54.     }  
  55.     public void setLev(int lev) {  
  56.         this.lev = lev;  
  57.     }  
  58.     @Column(name="sort")  
  59.     public int getSort() {  
  60.         return sort;  
  61.     }  
  62.     public void setSort(int sort) {  
  63.         this.sort = sort;  
  64.     }  
  65.         //多对多映射  
  66.     @ManyToMany(mappedBy="rights")  
  67.     public List<Role> getRoles() {  
  68.         return roles;  
  69.     }  
  70.     public void setRoles(List<Role> roles) {  
  71.         this.roles = roles;  
  72.     }  
  73.     @Override  
  74.     public String toString() {  
  75.         return "Right [lev=" + lev + ", parent_id=" + parent_id + ", right_id="  
  76.                 + right_id + ", right_name=" + right_name   
  77.                 + ", sort=" + sort + ", url=" + url + "]";  
  78.     }  
  79.   
  80.   
  81.       
  82.       
  83. }  

 

 

最后,在hibernate-cfg.xml文件中配置对应的Role和Right实体即可。

 

Hibernate.cfg.xml代码   收藏代码
  1. <mapping class="com.entor.hibernate.manytomany.Role"/>  
  2. <mapping class="com.entor.hibernate.manytomany.Right"/>  

到这里一个多对多配置就完成了。

 

常用的注解:

1.@Entity 声明实体

2.@Table(name="SYS_ROLE") 声明实体类对应的表名

3.@Column(name="role_name") 声明属性对应的列

4.@Id @GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")

声明主键及生成策略,在这里uid的生成策略

5. @OneToOne(mappedBy="card") 一对一映射

6.@OneToMany(fetch = FetchType.LAZY, mappedBy = "student") 一对多映射

7.@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "student")

    多对一映射

8.@ManyToMany(targetEntity = Right.class, fetch = FetchType.LAZY)

@JoinTable(name = "ROLE_RIGHT", joinColumns = @JoinColumn(name = "ROLE_ID"), inverseJoinColumns = @JoinColumn(name = "RIGHT_ID"))

  多对多映射

9.@Transient      表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性

 

 

二、第二种情况,就是在中间实体中配置两个多对一关系,以学生Student-成绩Score-课程Course为例。

 

Student类代码   收藏代码
  1. import java.util.List;  
  2. import javax.persistence.*;  
  3. import org.hibernate.annotations.GenericGenerator;  
  4.   
  5. @Entity  
  6. @Table(name="student")  
  7. public class Student {  
  8.   
  9.     private String id;  
  10.     private String name;  
  11.   
  12.     private List<Score> scoreList;  
  13.       
  14.     @Id  
  15.     @GeneratedValue(generator = "paymentableGenerator")    
  16.     @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")  
  17.     public String getId() {  
  18.         return id;  
  19.     }  
  20.     public void setId(String id) {  
  21.         this.id = id;  
  22.     }  
  23.     @Column(name="name")  
  24.     public String getName() {  
  25.         return name;  
  26.     }  
  27.     public void setName(String name) {  
  28.         this.name = name;  
  29.     }  
  30.         //学生端一对多,学生的成绩列表,也可以选择不配置  
  31.     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "student")  
  32.     public List<Score> getScoreList() {  
  33.         return scoreList;  
  34.     }  
  35.     public void setScoreList(List<Score> scoreList) {  
  36.         this.scoreList = scoreList;  
  37.     }  
  38.     @Override  
  39.     public String toString() {  
  40.         return "Student [id=" + id + ", name=" + name + "]";  
  41.     }  
  42.       
  43.       
  44.   
  45. }  

 

Score类代码   收藏代码
  1. import javax.persistence.*;  
  2. import org.hibernate.annotations.GenericGenerator;  
  3.   
  4. @Entity  
  5. @Table(name="score")  
  6. public class Score {  
  7.   
  8.     private String id;//主键id  
  9.     private Student student;//学生id  
  10.     private Course course;//课程id  
  11.     private int score;//成绩  
  12.       
  13.     @Id  
  14.     @GeneratedValue(generator = "paymentableGenerator")    
  15.     @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")  
  16.     public String getId() {  
  17.         return id;  
  18.     }  
  19.     public void setId(String id) {  
  20.         this.id = id;  
  21.     }  
  22.         //多对一映射  
  23.     @ManyToOne(fetch = FetchType.LAZY)  
  24.     @JoinColumn(name = "student")  
  25.     public Student getStudent() {  
  26.         return student;  
  27.     }  
  28.     public void setStudent(Student student) {  
  29.         this.student = student;  
  30.     }  
  31.         //多对一映射  
  32.     @ManyToOne(fetch = FetchType.LAZY)  
  33.     @JoinColumn(name = "course")  
  34.     public Course getCourse() {  
  35.         return course;  
  36.     }  
  37.     public void setCourse(Course course) {  
  38.         this.course = course;  
  39.     }  
  40.     @Column(name="score")  
  41.     public int getScore() {  
  42.         return score;  
  43.     }  
  44.     public void setScore(int score) {  
  45.         this.score = score;  
  46.     }  
  47.     @Override  
  48.     public String toString() {  
  49.         return "Score [course=" + course.getName() + ", score=" + score + ", student="  
  50.                 + student.getName() + "]";  
  51.     }  
  52.       
  53.       
  54. }  

 

Course类代码   收藏代码
  1. import java.util.List;  
  2. import javax.persistence.*;  
  3. import org.hibernate.annotations.GenericGenerator;  
  4.   
  5. @Entity  
  6. @Table(name="course")  
  7. public class Course {  
  8.   
  9.     private String id;  
  10.     private String name;  
  11.     private List<Score> scoreList;  
  12.       
  13.     @Id  
  14.     @GeneratedValue(generator = "paymentableGenerator")    
  15.     @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")  
  16.     public String getId() {  
  17.         return id;  
  18.     }  
  19.     public void setId(String id) {  
  20.         this.id = id;  
  21.     }  
  22.     @Column(name="name")  
  23.     public String getName() {  
  24.         return name;  
  25.     }  
  26.     public void setName(String name) {  
  27.         this.name = name;  
  28.     }  
  29.         <span style="line-height: 1.5;">//课程端一对多,课程的成绩列表,也可以选择不配置</span>  
  30.     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "course")  
  31.     public List<Score> getScoreList() {  
  32.         return scoreList;  
  33.     }  
  34.     public void setScoreList(List<Score> scoreList) {  
  35.         this.scoreList = scoreList;  
  36.     }  
  37.     @Override  
  38.     public String toString() {  
  39.         return "Course [id=" + id + ", name=" + name + "]";  
  40.     }  
  41.       
  42.       
  43. }  

 

以上就是多对多两种情况的注解配置方法了,注解方式真的是很优秀的配置方法,很直观很简洁一目了然,也不需要另外配置xml文件,直接在实体类文件中注明数据库关系映射的情况即可,开发效率提高很明显,我用过注解配置之后都不想用配置文件来配置了,哈哈~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值