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>

 

你可能感兴趣的:(Hibernate)