首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Hibernate Annotation诠释实现联合主键和一对多关联的示例

2012-09-01 
Hibernate Annotation注释实现联合主键和一对多关联的示例需求: 1.有一个User类,有如下属性:String userna

Hibernate Annotation注释实现联合主键和一对多关联的示例
需求:
1.有一个User类,有如下属性:
    String username; //PK
    String password;
    Set grantedAuthority; //一对多关联到Authorities
2.有一个Authorities,有如下属性:
    String username; //主键1
    String authority; //主键2
要实现如注释所示的表关系。

做法:
一。联合主键的制作
    网上有三种方法,我用的是@IdClass标签的方法。
    需要为联合主键多做一个类AuthoritiesPK(需要实现Serializable接口)来实现主键的联合,其中属性只需要有联合主键的字段就行了,并且为它们实现get和set方法,这个类不需要做任何的annotation标记。
    另一个Authorities类在@Entity标记下面添加一个@IdClass(AuthoritiesPK.class),括号里面的是前面那个新建的类。然后再在Authorities类中的主键的get方法前添加@Id标签就可以了。
*别忘了mapping文件,只要对User和Authorities两个类做映射就行了,不用做那个AuthoritiesPK的。

二。一对多关联
    我原先的设置是这样的,这是个错误的配置。

@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)@JoinTable(name="authorities",            joinColumns=@JoinColumn(name="username")) public Set getGrantedAuthorities() {         return grantedAuthorities; }

    这样配置最后在生成表的时候,User和Authorities关联会多出来两个列"grantedAuthorities_username"和"grantedAuthorities_password"并且在使用过程中会出错。
    正确的配置如下:
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)@JoinColumn(name="username") public Set getGrantedAuthorities() {         return grantedAuthorities; } 

    这样Authorities表中的username属性就被正确的和User表中的username关联起来的。

*重要的提示!
    顺带一提的事这个JoinColumn的意义是从表(Authority)中的这个字段(username)和主表(User)的主键(username这个不是配置里面的那个username要注意哦!)相互关联。


热点排行