这次的学习笔记是 hibernate的多对多关系设置,后面拆分成两个一对多。多对多常见到不能常见的是用户和角色的关系啦。。。项目都有用到,特别是统一身份认证系统(刚从学校出来做过统一身份认证时,有点无聊)。 一个用户可能有多个角色,比如学校的小明可以是普通学生,也可以是学生会组长,学生会组长也会是别人,普通学生角色别的同学也会有。总的来说,普通学生的角色中包含一群学生,一个学生也可能 有多个角色。不说了,直拉上代码,基本的多对多代码。
user.java
package com.ywj.TestHibernate.e;
import java.io.Serializable;
import java.util.Set;
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6277707106263340356L;
private Long id;
private String name;
private Set<Role> role;// 多个角色
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Role> getRole() {
return role;
}
public void setRole(Set<Role> role) {
this.role = role;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ywj.TestHibernate.e">
<class name="User" table="User">
<id name="id" column="id" type="java.lang.Long">
<generator class="identity" />
</id>
<property name="name" />
<set name="role" table="userRole" inverse="true"><!-- inverse="true":由角色来控制关系,table="userRole":会生成一个中间表userRole -->
<key column="userId"></key><!-- 多对多会生成一张中间表,有个字段userId,对就的是user表的ID -->
<many-to-many class="Role" column="roleId"></many-to-many><!-- 多对多user怎么找到相关的role的?就是根据中间表userRole的userId来找到相对应的roleId的再来找到role -->
</set>
</class>
</hibernate-mapping>
Role.java
package com.ywj.TestHibernate.e;
import java.io.Serializable;
import java.util.Set;
public class Role implements Serializable {
/**
*
*/
private static final long serialVersionUID = 3207285849366951621L;
private Long id;
private String name;
private Set<User> user;// 多个用户
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<User> getUser() {
return user;
}
public void setUser(Set<User> user) {
this.user = user;
}
}
Role.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ywj.TestHibernate.e">
<class name="Role" table="role">
<id name="id" column="id" type="java.lang.Long">
<generator class="identity" />
</id>
<property name="name" />
<set name="user" table="userRole" inverse="false"><!-- 生成中间表userRole,inverse="false":角色来管理关系 -->
<key column="roleId"></key><!-- 多对多会生成一张中间表,有个字段roleId,对就的是role表的ID -->
<many-to-many class="User" column="userId"></many-to-many><!-- 多对多Role怎么找到相关的user的?就是根据中间表userRole的roleId来找到相对应的userId的来找到相关的user -->
</set>
</class>
</hibernate-mapping>
Test.java
package com.ywj.TestHibernate.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.ywj.TestHibernate.e.User;
import com.ywj.TestHibernate.e.Role;
public class Test {
public static void main(String[] args) {
Session s = HibernateUtils.getCurrentSession();
Transaction t = null;
try {
t = s.beginTransaction();
User u = new User();
u.setName("u5");
User u2 = new User();
u2.setName("u6");
Role r = new Role();
r.setName("r5");
Role r2 = new Role();
r2.setName("r6");
Set<User> uSet = new HashSet<User>();
uSet.add(u);
uSet.add(u2);
r.setUser(uSet);
r2.setUser(uSet);
s.save(u);
s.save(u2);
s.save(r);
s.save(r2);
t.commit();
// 查询
/*Role role = (Role) s.load(Role.class, 1L);
Set<User> users = role.getUser();
for(User u : users) {
System.out.println(u.getId()+":"+u.getName());
}*/
//查询
/*User u = (User) s.load(User.class, 1L);
Set<Role> roles = u.getRole();
for(Role r : roles) {
System.out.println(r.getId()+":"+r.getName());
}*/
} catch (Exception e) {
e.printStackTrace();
t.rollback();
} finally {
s.close();
}
}
}
OK,,,完毕。
接下来把多对多拆分成一对多,拆分不般是hIibernate自动生成的 中间表字段不够用,不适合自定义字段,所以我们自己定义一个中间表UserRole.,要什么字段自己来(要什么菜自己挟), 上代码。。。
User.java
package com.ywj.TestHibernate.e;
import java.io.Serializable;
import java.util.Set;
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6277707106263340356L;
private Long id;
private String name;
private Set<UserRole> userRole;
public User() {}
public User(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<UserRole> getUserRole() {
return userRole;
}
public void setUserRole(Set<UserRole> userRole) {
this.userRole = userRole;
}
}
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ywj.TestHibernate.e">
<class name="User" table="User">
<id name="id" column="id" type="java.lang.Long">
<generator class="identity" />
</id>
<property name="name" />
<set name="userRole" inverse="true">
<key column="user"></key>
<one-to-many class="UserRole"/>
</set>
</class>
</hibernate-mapping>
Role.java
package com.ywj.TestHibernate.e;
import java.io.Serializable;
import java.util.Set;
public class Role implements Serializable {
/**
*
*/
private static final long serialVersionUID = 3207285849366951621L;
private Long id;
private String name;
private Set<UserRole> userRole;
public Role() {}
public Role(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<UserRole> getUserRole() {
return userRole;
}
public void setUserRole(Set<UserRole> userRole) {
this.userRole = userRole;
}
}
Role.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ywj.TestHibernate.e">
<class name="Role" table="role">
<id name="id" column="id" type="java.lang.Long">
<generator class="identity" />
</id>
<property name="name" />
<set name="userRole" inverse="true">
<key column="role"></key>
<one-to-many class="UserRole"/>
</set>
</class>
</hibernate-mapping>
UserRole.java
package com.ywj.TestHibernate.e;
import java.io.Serializable;
import java.util.Date;
public class UserRole implements Serializable {
/**
*
*/
private static final long serialVersionUID = 3207285849366951621L;
private Long id;
private Date date;// 授权时间 ,有问题可以根据时间来查
private User user;
private Role role;
public UserRole(User user, Role role) {
this.user = user;
this.role = role;
this.date = new Date();
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
UserRole.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ywj.TestHibernate.e">
<class name="UserRole" table="UserRole">
<id name="id" column="id" type="java.lang.Long">
<generator class="identity" />
</id>
<property name="date" column="date" type="java.util.Date"/>
<many-to-one name="user" column="user" class="User"></many-to-one>
<many-to-one name="role" column="role" class="Role"></many-to-one>
</class>
</hibernate-mapping>
Test.java
package com.ywj.TestHibernate.test;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.ywj.TestHibernate.e.User;
import com.ywj.TestHibernate.e.UserRole;
public class Test {
public static void main(String[] args) {
Session s = HibernateUtils.getCurrentSession();
Transaction t = null;
try {
/*
* t = s.beginTransaction();
*
* User u1 = new User("u1");
*
* User u2 = new User("u2");
*
*
*
*
* Role r1 = new Role("r1");
*
*
*
*
* Role r2 = new Role("r2");
*
*
*
*
* UserRole ur1 = new UserRole(u1,r1);
*
* UserRole ur2 = new UserRole(u1,r2);
*
*
*
*
* UserRole ur3 = new UserRole(u2,r1);
*
*
*
*
* UserRole ur4 = new UserRole(u2,r2);
*
*
*
*
*
* s.save(u1); s.save(u2); s.save(r1); s.save(r2); s.save(ur1); s.save(ur2);
* s.save(ur3); s.save(ur4);
*
*
* t.commit();
*/
// 查询
User u = (User) s.load(User.class, 3L);
Set<UserRole> urs = u.getUserRole();
for (UserRole ur : urs) {
System.out.println(ur.getDate() + ":" + ur.getRole().getName());
}
} catch (Exception e) {
e.printStackTrace();
t.rollback();
} finally {
s.close();
}
}
}
ok...