1、多对一关联
xml配置
1)、一个组可以有多个用户,一个用户所以一个主。User表与Group表的关系是多对已
User表
package com.mr.cheng.associations; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Table(name="t_user") public class User { private int id; private String name; private Group group; public Group getGroup() { return group; } public void setGroup(Group group) { this.group = group; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Group表
package com.mr.cheng.associations; import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import javax.persistence.Table; @Entity @Table(name="t_group") public class Group { private int id; private String name; @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
User.hbm.<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjsxt.hibernate.User" table="t_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property>
<many-to-one name="group" column="groupId"></many-to-one> </class> </hibernate-mapping>
Group.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.mr.cheng.associations.Group" table="tt_group"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> </class> </hibernate-mapping>
2)、一对多配置
在Group对象中加一个Set类型的字段,代码如下
package com.mr.cheng.associations; import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import javax.persistence.Table; @Entity @Table(name="t_group") public class Group { private int id; private String name; private Set<User> userSet = new HashSet<User>(); public Set<User> getUserSet() { return userSet; } public void setUserSet(Set<User> userSet) { this.userSet = userSet; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Group.hbm.xml配置如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.mr.cheng.associations.Group" table="tt_group"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <set name="userSet"> <key column="groupId"></key> <one-to-many class="com.mr.cheng.associations.User"/> </set> </class> </hibernate-mapping>
配置一对多时,在Group.hbm.xml文件中set属性名字对应Group的字段,key中的Column属性对应外键名字,即是通过groupId进行关联。 one-to-many 中的class对应关联的类。
User表
package com.mr.cheng.associations; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Table(name="t_user") public class User { private int id; private String name; @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
User.hbm.xml配置如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.mr.cheng.associations.User" table="tt_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> </class> </hibernate-mapping>
3)、多对一 与 已对多双向关联
User 对象代码如下:
package com.mr.cheng.associations; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Table(name="t_user") public class User { private int id; private String name; private Group group; public Group getGroup() { return group; } public void setGroup(Group group) { this.group = group; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Group对象代码如下:
package com.mr.cheng.associations; import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import javax.persistence.Table; @Entity @Table(name="t_group") public class Group { private int id; private String name; private Set<User> userSet = new HashSet<User>(); public Set<User> getUserSet() { return userSet; } public void setUserSet(Set<User> userSet) { this.userSet = userSet; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
User.hbm.xml配日志如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.mr.cheng.associations.User" table="tt_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <many-to-one name="group" column="groupId"></many-to-one> </class> </hibernate-mapping>
Group.hbm.xml配置如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.mr.cheng.associations.Group" table="tt_group"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <set name="userSet"> <key column="groupId"></key> <one-to-many class="com.mr.cheng.associations.User"/> </set> </class> </hibernate-mapping>
注意:group.hbm.xml中的一对多配置时 key 中column属性的值必须与User.hbm.xml中的 many-to-one属性中的name值一直。否则出现意想不到的结果。
4)、多对多双向关联
一个用户可以选择多个房间,一个房间可以住多个人,因此User表与Room表的关系就为多对多的关系。
User对象代码如下:
package com.mr.cheng.associations; import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Table(name="t_user") public class User { private int id; private String name; private Set<Room> roomSet = new HashSet<Room>(); public Set<Room> getRoomSet() { return roomSet; } public void setRoomSet(Set<Room> roomSet) { this.roomSet = roomSet; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Room对象的代码如下:
package com.mr.cheng.associations; import java.util.HashSet; import java.util.Set; public class Room { private int id; private String name; private Set<User> userSet = new HashSet<User>(); public Set<User> getUserSet() { return userSet; } public void setUserSet(Set<User> userSet) { this.userSet = userSet; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
User.hbm.xml的配置如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.mr.cheng.associations.User" table="tt_user"> <id name="id" column="userId"> <generator class="native"></generator> </id> <property name="name"></property> <set name="roomSet" inverse="true" table="tt_user_room"> <key column="userId"></key> <many-to-many class="com.mr.cheng.associations.Room" column="roomId"></many-to-many> </set> </class> </hibernate-mapping>
Room.hbm.xml的配置如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.mr.cheng.associations.Room" table="tt_room"> <id name="id" column="roomId"> <generator class="native"></generator> </id> <property name="name"></property> <set name="userSet" table="tt_user_room"> <key column="roomId"></key> <many-to-many class="com.mr.cheng.associations.User" column="userId"></many-to-many> </set> </class> </hibernate-mapping>