Hibernate 多对多配置和操作
这里以用户和角色为例
第一步创建两个实体类用户和角色,并让两个实体类互相表示,Hibernate中用Set集合表示
用户实体类
package com.netxintai.mary;
import java.util.HashSet;
import java.util.Set;
public class User {
private Integer u_id;
private String username;
private String address;
private String phone;
private Set<Role> setRole=new HashSet<Role>();
public Integer getU_id() {
return u_id;
}
public void setU_id(Integer u_id) {
this.u_id = u_id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Set<Role> getSetRole() {
return setRole;
}
public void setSetRole(Set<Role> setRole) {
this.setRole = setRole;
}
}
角色类
package com.netxintai.mary;
import java.util.HashSet;
import java.util.Set;
public class Role {
private Integer r_id;
private String role_name;
private String role_level;
private Set<User> setUser=new HashSet<User>();
public Integer getR_id() {
return r_id;
}
public void setR_id(Integer r_id) {
this.r_id = r_id;
}
public String getRole_name() {
return role_name;
}
public void setRole_name(String role_name) {
this.role_name = role_name;
}
public String getRole_level() {
return role_level;
}
public void setRole_level(String role_level) {
this.role_level = role_level;
}
public Set<User> getSetUser() {
return setUser;
}
public void setSetUser(Set<User> setUser) {
this.setUser = setUser;
}
}
第二步配置两个实体类的映射文件
用户User类配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.netxintai.mary.User" table="t_user"> <id name="u_id" column="u_id"> <generator class="native"></generator> </id> <property name="username" column="username" /> <property name="address" column="address" /> <property name="phone" column="phone" /> <!-- 在用户里面表示所有角色,使用set标签 name属性:角色set集合名称 table属性:第三章表名称 --> <set name="setRole" table="user_role"> <!-- Key 标签里面配置 配置当日前映射文件在第三章表外键名称 --> <key column="userid"></key> <!-- class:橘色实体类全路径 column:橘色在第三章表中外键名称 --> <many-to-many class="com.netxintai.mary.Role" column="roleid"></many-to-many> </set> </class> </hibernate-mapping>
角色类配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.netxintai.mary.Role" table="t_role"> <id name="r_id" column="r_id"> <generator class="native"></generator> </id> <property name="role_name" column="role_name" /> <property name="role_level" column="role_level" /> <!-- 在角色里面表示所有用户,使用set标签 --> <set name="setUser" table="user_role" cascade="save-update"> <!-- 角色在第三张表外键 --> <key column="roleid"></key> <many-to-many class="com.netxintai.mary.User" column="userid"></many-to-many> </set> </class> </hibernate-mapping>
第三步 将配置文件引入hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 配置数据信息 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///mydb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123</property> <!-- 配置hibernate信息 可选 --> <!-- 输出sql语句--> <property name="hibernate.show_sql">true</property> <!-- 格式化sql语句 --> <property name="hibernate.format_sql">true</property> <!-- hibernate帮创建表 需要配置后 update:如果已经存在表,更新,如果没有 创建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 配置数据库方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 把映射文件放到核心配置文件中 --> <property name="hibernate.current_session_context_class">thread</property> <!-- 引入配置文件 --> <mapping resource="com/netxintai/mary/Role.hbm.xml"/> <mapping resource="com/netxintai/mary/User.hbm.xml"/> </session-factory> </hibernate-configuration>
第四步 进行测试代码
package com.netxintai.dome;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;
import com.netxintai.mary.Role;
import com.netxintai.mary.User;
import com.netxintai.utils.HiberntaeUtils;
public class DomeTEST {
private SessionFactory sessionFactory;
private Session session;
private Transaction tr;
@Test
public void DomeTest() {
try {
sessionFactory = HiberntaeUtils.getsessionFactory();
session = sessionFactory.openSession();
tr = session.beginTransaction();
User user=new User();
Role role=new Role();
Role role2=new Role();
user.setAddress("北京");
user.setUsername("朱棣");
user.setPhone("999999");
role.setRole_level("1");
role.setRole_name("超级管理员");
role2.setRole_level("2");
role2.setRole_name("管理员");
user.getSetRole().add(role2);
user.getSetRole().add(role);
session.save(user);
tr.commit();
} catch (Exception e) {
// TODO: handle exception
tr.rollback();
} finally {
}
}
}
数据库效果图
