例子:
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>