Hibernate!!多对一与一对多单向关联映射

多对一单向关联映射

例子:

user和group的关系是多对一,很多用户是一个组的,每个用户有且只有一个组。

多对一,在annotation方式中,需要在多的一方(user)设置@ManyToOne  ,然后可以加上@JoinColumn(name="groupId"),

为在数据库user表加入的新列指定名字,如果不指定,就是自动生成的group_id。

注意:group在数据库中是关键字,所以需要重新指定表的名字,不然没有表生成。

 1 @Entity
 2 @Table(name="t_group")//group是关键字,不重新命名就没有表生成
 3 public class Group {
 4     private  int  id ;
 5     private  String  name ;
 6     
 7     @Id
 8     @GeneratedValue
 9     public int getId() {
10         return id;
11     }
 1 @Entity
 2 @Table(name="t_user")
 3 public class User {
 4     private  int  id ;
 5     private  String  name ;
 6     private  Group  group ;
 7     @Id
 8     @GeneratedValue
 9     public int getId() {
10         return id;
11     }
12     
13     //多对一单向关联映射,在多的一方配置
14     @ManyToOne   
15     @JoinColumn(name="groupId") //可以自动命名,写了之后就是按照此名字重新命名
16     public Group getGroup() {
17         return group;
18     }
19     

在xml方式中,也是在多的一方(user)的映射文件中添加<many-to-one name="group" column="groupId" />

 1 <hibernate-mapping>
 2     <class name="com.hb.model.Group" table="t_group">
 3         <id name="id">
 4             <generator class="native"></generator>
 5         </id>
 6         
 7         <property name="name"></property>
 8     </class>
 9     
10 </hibernate-mapping>
 1 <hibernate-mapping>
 2     <class name="com.hb.model.User" table="t_user">
 3         <id name="id">
 4             <generator class="native"></generator>
 5         </id>
 6         
 7         <property name="name"></property>
 8         <many-to-one name="group" column="groupId" />
 9     </class>
10     
11 </hibernate-mapping>

一对多单向关联映射

用annotation方式,如果只是仅仅在一的一方配置@OneToMany,如下图,那么会生成3个表,即有一个中间表,会当成多对多的情况。

 1 @Entity
 2 @Table(name="t_group")//group是关键字,不重新命名就没有表生成
 3 public class Group {
 4     private  int  id ;
 5     private  String  name ;
 6     private  Set<User>  users = new  HashSet<User>();
 7     
 8     @Id
 9     @GeneratedValue
10     public int getId() {
11         return id;
12     }
13     
14     @OneToMany
15     public Set<User> getUsers() {
16         return users;
17     }
 1 @Entity
 2 @Table(name="t_user")
 3 public class User {
 4     private  int  id ;
 5     private  String  name ;
 6     
 7     @Id
 8     @GeneratedValue
 9     public int getId() {
10         return id;
11     }
12     
13     

 

这样就会产生冗余。

修改如下:

@OneToMany下面加上@JoinColumn(name="groupId") ,记住:永远加在多的一方

 1 @Entity
 2 @Table(name="t_group")//group是关键字,不重新命名就没有表生成
 3 public class Group {
 4     private  int  id ;
 5     private  String  name ;
 6     private  Set<User>  users = new  HashSet<User>();
 7     
 8     @Id
 9     @GeneratedValue
10     public int getId() {
11         return id;
12     }
13     
14     @OneToMany   //只写这个会认为存在一张中间表
15     @JoinColumn(name="groupId") //记住,永远会加在多的一方,即在数据库中,新加的列是在多的一方,多的一方有外键
16     public Set<User> getUsers() {
17         return users;
18     }

生成的表如下:

 

在xml中:

 1 <hibernate-mapping>
 2     <class name="com.hb.model.Group" table="t_group">
 3         <id name="id">
 4             <generator class="native"></generator>
 5         </id>
 6         
 7         <property name="name"></property>
 8         <set name="users">
 9             <!-- key是指定添加的外键的名字 -->
10             <key column="groupId"></key>
11             <one-to-many  class="com.hb.model.User"/>
12         </set>
13     </class>
14     
15 </hibernate-mapping>
 1 <hibernate-mapping>
 2     <class name="com.hb.model.User" table="t_user">
 3         <id name="id">
 4             <generator class="native"></generator>
 5         </id>
 6         
 7         <property name="name"></property>
 8     </class>
 9     
10 </hibernate-mapping>

 

posted @ 2014-12-11 16:03  Mokaffe  阅读(271)  评论(0编辑  收藏  举报