初学Hibernate一对多关联
今天,花了些时间去了解了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); } }
完毕。。。