◎筱米加步枪◎.Blog

Happy coding

初学Hibernate一对多关联

筱米加步枪 posted @ 2010年4月08日 04:33 in [ 开源框架 ] with tags Hibernate , 10693 阅读

今天,花了些时间去了解了Hibernate的一对多关联,做的例子是

描述一个用户拥有多个角色。实现一个添加用户,从而在数据库中添加用户和角色记录

角色记录由Hibernate完成。

贴个代码:(只贴出主要部分)

1.SQL脚本

--用户表
create table users
(
   userID number primary key, --用户ID
   name varchar(20)  -- not null--真实姓名
);

--角色表
create table roles
(
    roleID number primary key, --角色ID
    roleName varchar2(20),    --角色名称
    userID number
);

alter table roles add constraint fk_role_re_user 
foreign key(userID) references users(userID);

1.POJO-用户对象

/**
 * 用户对象
 * @author ChenST
 */
public class Users implements java.io.Serializable {

	//用户ID
	private Long userid;

	//姓名
	private String name;

	//角色列表
	private Set roleses = new HashSet(0);

	// Constructors
	/** default constructor */
	public Users() {
	}
	
	////setter和getter方法略
}

2.POJO-角色对象

/**
 * 角色对象
 * @author ChenST
 */
public class Roles implements java.io.Serializable {

	//角色ID
	private Long roleid;

	//所属于用户
	private Users users;

	//角色名
	private String rolename;

	//所属于用户ID
	private Long userid;

	// Constructors
	/** default constructor */
	public Roles() {
	}
	
	///setter和getter方法略
}

3.HBM-用户映射文件

<hibernate-mapping>
    <class name="com.shine.pojo.Users" table="USERS" schema="CST">
        <id name="userid" type="java.lang.Long">
            <column name="USERID" precision="22" scale="0" />
            <!-- 
                    如果非自动增长列,可以设置成assigned 
                    不能设置成sequence
            -->
            <generator  class="assigned"/>
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="20" />
        </property>
        <!-- 
              此处的cascade要设置成save-update,
              否则无法级联更新(插入)
            cascade的值
                 sava-update:级联保存、更新
                 delete:级联删除
                 none:不级联,默认值
                 all:级联保存、更新、删除
            inverse属性表示是否把对Set的改动反应到数据库中去
            inverse=true不反应  inverse=false反应(默认)
            =false表示会去维护中间表 =true表示不会去维护中间表
         -->
        <set name="roleses" inverse="false" cascade="save-update">
            <key>
                <column name="ROLEID" precision="22" scale="0" 
                        not-null="true" unique="true" />
            </key>
            <one-to-many class="com.shine.pojo.Roles" />
        </set>
    </class>
</hibernate-mapping>

4.HBM-角色映射文件

<hibernate-mapping>
    <class name="com.shine.pojo.Roles" table="ROLES" schema="CST">
        <id name="roleid" type="java.lang.Long">
            <column name="ROLEID" precision="22" scale="0" />
            <!-- 
                    如果非自动增长列,可以设置成assigned 
                    不能设置成sequence
            -->
            <generator class="assigned" />
        </id>
        <many-to-one name="users" class="com.shine.pojo.Users" 
                     update="false" insert="false" fetch="select">
            <column name="ROLEID" precision="22" scale="0" 
                    not-null="true" unique="true" />
        </many-to-one>
        <property name="rolename" type="java.lang.String">
            <column name="ROLENAME" length="20" />
        </property>
        <property name="userid" type="java.lang.Long">
            <column name="USERID" precision="22" scale="0" />
        </property>
    </class>
</hibernate-mapping>

5.DAO-用户DAO实现类

/**
 * 用户Dao的实现类
 * @author ChenST
 *
 */
public class UserDaoImpl implements IUserDao {

	/**
	 * 保存对象
	 */
	public void save(Users user) {
		//Session对象负责执行被持久化对象的CURD操作
		Session session=null;
		//Transaction对象负责事务上的
		Transaction trans=null;
		try{
			//获取session对象
			session=HibernateSessionFactory.getSession();
			//获取事务
			trans=session.beginTransaction();
			session.saveOrUpdate(user);
			trans.commit();
		}catch (Exception e) {
			e.printStackTrace();
			trans.rollback();
		}finally{
			//关闭Session
			HibernateSessionFactory.closeSession();
		}
	}
}

6.JUNIT-用户Dao测试

/**
 * 测试UserDao
 * @author ChenST
 */
public class UserDaoTest extends TestCase {
	
	/**
	 * 测试保存方法
	 */
	public void testSave(){
		IUserDao userDao=new UserDaoImpl();
		Users user=new Users(3L,"cst",new HashSet());
		Roles role1=new Roles(3L,user,"a",3L);
		user.getRoleses().add(role1);
		userDao.save(user);
	}
}

 完毕。。。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter