080306日志(hibernate对象操作-多对多关联)
过程:
新建一个javabean Role.java
包含属性
private long id;
private String rolename;
private String rolecode;
private String remark;
private Set events = new HashSet();
新增role.hbm.xml来映射role表,没什么特别之处,唯一不同的地方在于新增表的多对多关联
<set name="events" table="role_userpass">
<key column="roleid"/>
<many-to-many column="logid" class="com.lucifer.hibernate.events.Ian_UserpassForm"/>
</set>
第一行的name就是Role类里java.util.Set的实例名,table是两表做关联映射表的表名
关联里的标识字段名,role一端由KEY来定义,另一张表则用many-to-many里的column属性定义,class用来定义另一表的映射类
在EventManager里新增一个方法(该方法完整代码见前几期的日志)
private void addRoleToUserpass(long logid,long roleid)
{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Iam_UserpassForm form = (Iam_UserpassForm)session.load(Iam_UserpassForm.class, logid);
Role role = (Role)session.load(Role.class, roleid);
role.getEvents().add(form);
session.getTransaction().commit();
}
重编译后做了ant run -Daction=save操作,并没有看出做了多对多之后有什么变化,即使是在加载了ROLE表之后也是如此,奇怪啊
到目前为止对持久化状态有了些个人的体会(不一定对),感觉hibernate对某表的持久化状态是跟SessionFactory息息相关的,个人认为当某表被加载到session里时该表就被持久化,比如做session.save时。
那么这个持久化的状态在什么时候解除呢?应该是在commit或者rollback的时候解除,或者没有做上述2个操作,当此session失效或者被关闭时也会接触;这样看来这个持久化状态似乎于hibernate.cfg.xml中的<property name="current_session_context_class">thread</property>也有关系,这个要去查一下。
解答:
2008-02-29-2:可以对表进行操作后针对XXXX.hbm.xml做了一系列的测试,发现在<property name="XXXX"/>如果不设置column属性,则hibernate默认name属性的值对表字段进行映射,如果设置了column属性则根据该属性;若不设置type属性,则由hibernate自动对该列的数据类型进行匹配(对int,String,java.util.Date进行了测试,匹配正常)
2008-03-05-1:昨天写完日志后又仔细看了下自己的build.xml,总算是理解了classpathref是类路径引用的真实含义。。。classpathref="libraries"这个值libraries我在前面定义过,是一个路径指想lib目录。。
疑问:
多对多设置还需要多测试观察,至少目前看不出干什么用的
附录:
java.util.Set类是一种无重复元素的collection,既其中所有元素都不满足条件A.equals(B)为TRUE。我比较好奇这种集合类型是如何保证被add的元素不重复的,莫非ADD同一个值两次会报异常?
感想:
今天没啥感想,38快到了,祝所有女人节日快乐
推荐文章 |
