以下是我的映射文件代码:
<hibernate-mapping>
<class name="demo1.many_to_one.mediaadv.MediaAdv" table="media_adv" catalog="report" >
<id name="advid" type="java.lang.String">
<column name="advid" length="20" />
<generator class="assigned" />
</id>
<property name="adate" type="java.util.Date">
<column name="adate" length="19" />
</property>
<property name="no" type="java.lang.String">
<column name="no" length="6" />
</property>
<property name="advname" type="java.lang.String">
<column name="advname" length="200" />
</property>
<property name="remark" type="java.lang.String">
<column name="remark" length="1000" />
</property>
<many-to-one name="media" class="demo1.many_to_one.media.Media" column="mediaid" update="false" cascade="none" >
</many-to-one>
</class>
</hibernate-mapping>
以下是java代码:
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
MediaAdvDAO dao = new MediaAdvDAO();
MediaAdv ma = dao.findById("advtest");
Media me = ma.getMedia();
ma.setAdvname("aftertest1");
me.setMedianame("Ais sms");
//按我的理解,因为cascade="none",所以me对象不应该被更新到数据库里面,但事实上他却被更新到数据里面了
System.out.println((ma.getMedia()).getMedianame());
session.flush();
session.getTransaction().commit();
HibernateSessionFactory.closeSession();
请各位帮我看一下.
问题补充
MediaAdv ma = dao.findById("advtest");
Media me = ma.getMedia();
me是通过ma获得的,获得之后me也是一个entity,当事务提交的时候,是将ma和me当着两个entity去提交更新的,并不是通过cascade的属性去关联更新的。
这样子有点明白..
cascade 的具体作用是什么..可大概说一下吗
问题补充
按你的提示
找到解决办法了
将many-to-one的lazy设置为false
然后java代码改为:
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
MediaAdvDAO dao = new MediaAdvDAO();
MediaAdv ma = dao.findById("advtest");
session.getTransaction().commit();
HibernateSessionFactory.closeSession();Media me = ma.getMedia(); ma.setAdvname("aftertest12"); me.setMedianame("Ais sms231"); System.out.println("ttttttttt"); Session session2 = HibernateSessionFactory.getSession(); session2.beginTransaction(); dao.attachDirty(ma); session2.getTransaction().commit();