学习多表映射配置要遵循的步骤
第一步:确立两张表之间的关系
第二步:在数据库中实现两张表之间的关系建立,在数据库中实现多对多要靠中间表,中间表只能出现两表的主键
第三步:在实体类中描述出两个实体之间的关系,
建立多对多实体类,两个实体类分别提供对方实体类set集合的引用
建立一对多实体类,当中间表有其他字段时以一对多方式建立实体类
第四步:在映射配置文件中建立两个实体和两张表之间的关系
User.java
private Integer userId;
private String userName;
private Set<Role> role = new HashSet<>(0);
User.hbm.xml
<?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="org.haiwen.entity.User" table="user" >
<id name="userId" column="user_id" >
<generator class="native" />
</id>
<property name="userName" type="java.lang.String" column="user_name" />
<!-- 多对多关系映射
标签:set
作用:用于映射set集合属性
属性:name,指定集合的名称
table,指定中间表的名称
标签:key
作用:用于映射外键关系
属性:column,指定当前实体类在中间表的外键字段的名称
标签:many-to-maney
作用:用于建立多对多的映射配置
属性:class,对方实体类的名称
column,对方在中间表的外键字段名称 -->
<set name="role" table="user_role" inverse="true">
<key column="user_id"></key>
<many-to-many class="org.haiwen.entity.Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Role.java
private Integer roleId;
private String roleName;
private Set<User> user = new HashSet<>(0);
Role.hbm.xml
<?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="org.haiwen.entity.Role" table="role">
<id name="roleId" column="role_id">
<generator class="native" />
</id>
<property name="roleName" type="java.lang.String" column="role_name" />
<set name="user" table="user_role">
<key column="role_id"></key>
<many-to-many class="org.haiwen.entity.User" column="user_id"></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="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2dll.auto">update</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="org/haiwen/entity/User.hbm.xml" />
<mapping resource="org/haiwen/entity/Role.hbm.xml" />
</session-factory>
</hibernate-configuration>
HibernateUtils.java
public class HibernateUtils {
static Configuration cfg;
static SessionFactory factory = null;
static {
try {
cfg = new Configuration();
cfg.configure();
factory = cfg.buildSessionFactory();
} catch (ExceptionInInitializerError e) {
throw new ExceptionInInitializerError("初始化SessionFactory失败,请检查配置文件");
}
}
public static Session getCurrentSession() {
return factory.getCurrentSession();// 每次使用该方法从当前线程上获取一个session,只有配置了session和线程绑定之后才能使用此方法,否则返回null
}
}
级联保存
/**
* 需求:
* 创建2个用户3个角色
* 让1号用户具备1号和2号角色
* 让2号用户具备2号和3号角色
*/
public void save() {
User user1 = new User();
user1.setUserName("用户1");
User user2 = new User();
user2.setUserName("用户2");
Role role1 = new Role();
role1.setRoleName("角色1");
Role role2 = new Role();
role2.setRoleName("角色2");
Role role3 = new Role();
role3.setRoleName("角色3");
user1.getRole().add(role1);
user1.getRole().add(role2);
user2.getRole().add(role2);
user2.getRole().add(role3);
role1.getUser().add(user1);
role2.getUser().add(user1);
role2.getUser().add(user2);
role3.getUser().add(user2);
Session session = HibernateUtils.getCurrentSession();
session.getTransaction().begin();
session.save(user1);
session.save(user2);
session.save(role1);
session.save(role2);
session.save(role3);
session.getTransaction().commit();
}
级联删除
/**
* 实际开发中:多对多的双向级联删除是禁止使用的
*/
public void delete() {
Session session = HibernateUtils.getCurrentSession();
session.getTransaction().begin();
User user = (User) session.get(User.class, 1);
session.delete(user);
session.getTransaction().commit();
}