多对一关联映射原理:
在多的(组)一端加入一个外键,指向一(用户)的一端,映射完成之后使得加载多的一端数据的同时能把关联的一的一端的数据加载上来。
两个类实现多对一的关联映射步骤:
SQL文件:
DROP TABLE IF EXISTS `groups`;
CREATE TABLE `groups` (
`id` varchar(255) NOT NULL,
`gname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` varchar(255) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`groupid` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(1)XML版
User类作为一的一端,则需要加入一个Group作为外键:
package Hibernate_demo1.Demo5.Entity;
public class User {
private String id;
private String name;
private Group group;
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Group类作为多的一端:
package Hibernate_demo1.Demo5.Entity;
public class Group {
private String id;
private String gname;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
}
User类的映射配置如下:
<?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="Hibernate_demo1.Demo5.Entity.User" table="User" lazy="false">
<id name="id" column="id">
<generator class="uuid" />
</id>
<property name="name" column="name"/>
<many-to-one name="group" column="groupid"/>
</class>
</hibernate-mapping>
Group类的映射配置如下:
<?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="Hibernate_demo1.Demo5.Entity.Group" table="Groups" >
<id name="id" column="id" >
<generator class="uuid" />
</id>
<property name="gname" column="gname" type="string" />
</class>
</hibernate-mapping>
从上面的两个配置文件可以看出,多对一的关联映射只需要在一的一端配置一个<many-to-one>标签就可以了,如上面User类的配置生成的表的user为指向多的一端的外键。
测试类如下:
package Hibernate_demo1.Demo5;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import Hibernate_demo1.Demo5.Entity.Group;
import Hibernate_demo1.Demo5.Entity.User;
import Hibernate_demo1.Demo5.Util.HibernateUtils;
public class App
{
public static void main( String[] args )
{
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();
Group answer = new Group();
answer.setGname("JAVA");
session.save(answer);
User user = new User();
user.setName("fendo");
user.setGroup(answer);
User user1 = new User();
user1.setName("admin");
user1.setGroup(answer);
session.save(user);
session.save(user1);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
}
执行结果如下:
Hibernate:
insert
into
Groups
(gname, id)
values
(?, ?)
Hibernate:
insert
into
User
(name, groupid, id)
values
(?, ?, ?)
Hibernate:
insert
into
User
(name, groupid, id)
values
(?, ?, ?)
示例:http://download.csdn.net/detail/u011781521/9832546
(2)注解版
Group类
package Hibernate_demo1.Demo6.Entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "Groups")
public class Group {
@Id
@Column(name="id")
@GenericGenerator(name="uuidGenerator",strategy="uuid")
@GeneratedValue(generator="uuidGenerator")
private String id;
@Column(name = "gname")
private String gname;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
}
User 类
package Hibernate_demo1.Demo6.Entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "User")
public class User {
@Id
@Column(name="id")
@GenericGenerator(name="uuidGenerator",strategy="uuid")
@GeneratedValue(generator="uuidGenerator")
private String id;
@Column(name = "name")
private String name;
@ManyToOne()
@JoinColumn(name = "groupid")
private Group group;
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类:
public class App
{
public static void main( String[] args )
{
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
Group grp=new Group();
grp.setGname("fendo");
session.save(grp);
User use1=new User();
use1.setName("JAVA");
use1.setGroup(grp);
User user2=new User();
user2.setName("C++");
user2.setGroup(grp);
session.save(use1);
session.save(user2);
tx.commit();
session.close();
}
}
执行结果为:
Hibernate:
insert
into
Groups
(gname, id)
values
(?, ?)
Hibernate:
insert
into
User
(groupid, name, id)
values
(?, ?, ?)
Hibernate:
insert
into
User
(groupid, name, id)
values
(?, ?, ?)
示例: http://download.csdn.net/detail/u011781521/9832632