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

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

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

出错也容易检查

根据类配置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>


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值