废话不多说直接上贴图,详细解释都在配置映射文件中:
再写映射文件时先写关系注释,再根据注释写对应的关系,不要根据一个类一直写到整个完整关系,这样比较累,还麻烦,建议一个关系一个关系的写,这样有条理,还清晰
出错也容易检查
根据类配置hibernate:
类图:
实体类:
Department:
public class Department {
//id
//private String id;
private Long id;
//姓名
private String name;
//描述
private String desc;
//上司部门
private Department parent;
//下属部门
private Set<Department> children=new HashSet<Department>();
//部门所有员工
private Set<Employee> employees=new HashSet<Employee>();
setter...
getter...
}
Employee类:
public class Employee {
//id
private Long id;
//姓名
private String name;
//性别,true男false女
private boolean gender;
//生日
private Date birthday;
//描述
private String desc;
//所属部门
private Department department;
//对应账号
private UserAccount userAccount;
setter...
getter...
}
</pre><pre name="code" class="html">
Privilege类:
public class Privilege {
//id
private Long id;
//权限对应的操作
private String action;
//拥有该权限的账户
private Set<UserAccount> userAccounts=new HashSet<UserAccount>();
setter...
getter...
}
UserAccount类:
public class UserAccount {
//id
private Long id;
//用户名
private String userName;
//密码
private String password;
//所属员工
private Employee employee;
//权限集合
private Set<Privilege> privileges=new HashSet<Privilege>();
setter...
getter...
}
映射文件:
Department.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">
<!-- Generated 2016-4-8 20:12:23 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="com.leige.domain">
<class name="Department" table="department">
<id name="id" type="long" column="id">
<generator class="native"></generator>
</id>
<property name="name" length="15" type="string" column="name" />
<property name="desc" type="text" length="1000" column="desc_" />
<!-- 自身的多对一映射 上司部门
表示与上司部门的多对一关系
-->
<many-to-one name="parent" class="Department" column="parentID"></many-to-one>
<!-- 自身一对多映射,下属部门
表示与下属部门的一对多关系
-->
<set name="children">
<key column="parentID"></key>
<one-to-many class="Department" />
</set>
<!-- 部门与员工的一对多映射
本方为无外键方:-->
<set name="employees" lazy="true">
<key column="departmentID"></key>
<one-to-many class="Employee" />
</set>
</class>
</hibernate-mapping>
Employee.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">
<!-- Generated 2016-4-8 20:12:23 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="com.leige.domain">
<class name="Employee" table="employees">
<id name="id" type="long">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="string">
<column name="name" />
</property>
<property name="gender" type="boolean">
<column name="gender" />
</property>
<property name="birthday" type="date">
<column name="birthday" />
</property>
<property name="desc" type="text" length="1000">
<column name="desc_" />
</property>
<!-- 员工与部门的多对一映射
本方為有外鍵方,
-->
<many-to-one name="department" class="Department" column="departmentID" />
<!-- 员工与用户的一对一映射
级联删除,
property-ref:表示引用了UserAccount中的employee属性
本方为无外键方:
-->
<one-to-one name="userAccount" class="UserAccount" cascade="delete" property-ref="employee" >
</one-to-one>
</class>
</hibernate-mapping>
Privilege.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">
<!-- Generated 2016-4-8 20:12:23 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="com.leige.domain">
<class name="Privilege" table="PRIVILEGE">
<id name="id" type="long">
<column name="ID" />
<generator class="native" />
</id>
<property name="action" type="string">
<column name="action" />
</property>
<!-- 权限和用户的多对多映射
权限对象不维护中间表,减少不必要的数据库操作
当加载权限对象是立即加载用户
-->
<set name="userAccounts" inverse="true" lazy="false" table="user_privilege">
<key column="pid"></key>
<many-to-many class="UserAccount" column="uid"></many-to-many>
</set>
</class>
</hibernate-mapping>
UserAccount.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">
<!-- Generated 2016-4-8 20:12:23 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="com.leige.domain">
<class name="UserAccount" table="userAccount">
<id name="id" type="long">
<column name="ID" />
<generator class="native" />
</id>
<property name="userName" type="string" >
<column name="username" />
</property>
<property name="password" type="string" access="field">
<column name="pwd" />
</property>
<!-- 账户与员工的一对一映射
采用基于外键的方式
-->
<many-to-one name="employee" class="Employee" unique="true">
<column name="employeeID"></column>
</many-to-one>
<!-- 账户和权限的多对多映射
账户维护中间表:
立即加载
-->
<set name="privileges" table="user_privilege" inverse="false" lazy="false">
<key column="uid"></key>
<many-to-many class="Privilege" column="pid" ></many-to-many>
</set>
</class>
</hibernate-mapping>
配置文件:
hibnate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/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:///test</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 指定方言,指定mysql ,建议配置成上面,不然hibernate在执行创建表的时候会报错,目前没有找到原因-->
<property name="hbm2ddl.auto">update</property><!-- -这个参数指定,hibernate可以更新数据,当为create时,hibernate每次执行插入操作都会先删除表,然后在创建表插入数据 -->
<property name="show_sql">true</property><!-- -这个参数,表示,hibernate会把自动生成的参数,显示在控制台给我们看,一般用于开发阶段 -->
<!-- 这个属性是设置事务隔离级别的
1:表示读未提交
2:表示读已提交
4:可重复读
8:串行化(不可并发) -->
<property name="hibernate.connection.isolation">2</property>
<!-- <mapping resource="com/leige/domain/User.hbm.xml"/> --><!-- -指定映射文件,告诉hibernate,对象与表的映射关系 -->
<!-- 配置c3p0数据库连接池我们可以在etc文件夹中找到所有的配置文件
#hibernate.c3p0.max_size 2 //数据库最大连接数
#hibernate.c3p0.min_size 2 最小连接数
#hibernate.c3p0.timeout 5000 最大连接时间
#hibernate.c3p0.max_statements 100 最大的PreparedStatement的数量
#hibernate.c3p0.idle_test_period 3000 每隔3000秒检查连接池里的空闲连接 ,单位是秒
#hibernate.c3p0.acquire_increment 2 当连接池里面的连接用完的时候,c3p0连接池增长的个数
#hibernate.c3p0.validate false 每次都验证连接是否可用 -->
<property name="hibernate.c3p0.max_size">15</property>
<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.acquire_increment">3</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- 配置hibernate二级缓存类型,指定二级缓存的实现类
这个类时hibernate自己的简单实现类
-->
<property name="cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>
<!-- 加载二级缓存的配置文件 -->
<property name="net.sf.ehcache.configurationResourceName">/ehcache.xml</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 指定查询缓存,list.itreate()方法都要开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- 指定使用二级缓存的类,以及缓存策略 -->
<mapping resource="com/leige/domain/Department.hbm.xml"/>
<mapping resource="com/leige/domain/Employee.hbm.xml"/>
<mapping resource="com/leige/domain/Privilege.hbm.xml"/>
<mapping resource="com/leige/domain/UserAccount.hbm.xml"/>
</session-factory>
</hibernate-configuration>
缓存配置文件:
<ehcache>
<diskStore path="c:/leige/"/>
<defaultCache
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>