hibernate映射多对多,一对一,一对多,自身关联综合应用

来源:互联网 发布:计算机算法与数学模型 编辑:程序博客网 时间:2024/05/23 19:13

废话不多说直接上贴图,详细解释都在配置映射文件中:

再写映射文件时先写关系注释,再根据注释写对应的关系,不要根据一个类一直写到整个完整关系,这样比较累,还麻烦,建议一个关系一个关系的写,这样有条理,还清晰

出错也容易检查

根据类配置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 {//idprivate 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 {//idprivate Long id;//权限对应的操作private String action;//拥有该权限的账户private Set<UserAccount> userAccounts=new HashSet<UserAccount>();setter...getter...}

UserAccount类:

public class UserAccount {//idprivate 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>


1 0