论坛首页 Java企业应用论坛

设置了inverse但是parent和children对象关联不上

浏览 3373 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-12-01  
大家好:

   我遇到一个问题,我有个一个article类和一个author类,是many-to-one的关系,我是在author一段设置了inverse="true"的,但是每次我 用代码:
Article art=new Article();;
article.setTitle("test");;
article.setContent("this is test");;
Author au=new Author();;
au.setAuthorname("lyo");;
au.addArticle(art);;
session.save(au);;

照理说如果我设置了inverse="true"的话,每次当session.save的时候,只需要save  inverse="true"的一端就可以了,但是我发现这不行,每次运行后只有author的内容被存入数据库,article的内容没有存入,这是怎麽回事?是不是我哪里忘记设置了?我的 xml文件如下:
<hibernate-mapping>
   <class name="lyo.hotmail.test.Article" table="article">
      <id name="id" column="id" type="int" unsaved-value="0">
	     <generator class="identity"/>
      </id>
	  <property name="title"/>
	  <property name="content"/>
	  <property name="time"/>
	  <many-to-one name="au"  column="aid"  not-null="true"/>
   </class>
   <class name="lyo.hotmail.test.Author" table="author">
      <id name="id" column="id" type="int" unsaved-value="0">
	     <generator class="identity"/>
      </id>
	  <property name="authorname"/>
	  <set name="article" lazy="true" inverse="true">
	     <key column="aid"/> 
		 <one-to-many class="lyo.hotmail.test.Article"/>
      </set>
   </class>
</hibernate-mapping>
   发表时间:2003-12-01  
说说我的理解,未经验证。

在你的代码中,au对象不是一个持久对象,因此au.addArticle(art)并不能触发一个插入art对象的操作。假设你这样写

Author au=new Author();; 
au.setAuthorname("lyo");; 
session.save(au);; 

au.addArticle(article);; 


就可以插入了art了。因为au已经成为一个持久对象了,他的add方法就可以触发插入动作。

如果你的au因为不是持久对象,因此需要显式的指定art来setAuthor:

Article art=new Article();; 
article.setTitle("test");; 
article.setContent("this is test");; 

Author au=new Author();; 
au.setAuthorname("lyo");; 
au.addArticle(art);; 

article.setAuthor(au);;

session.save(au);; 
0 请登录后投票
   发表时间:2003-12-01  
引用

照理说如果我设置了inverse="true"的话,每次当session.save的时候,只需要save inverse="true"的一端就可以了

没这种说法,你把inverse和cascade搞混了

凡是双向的关联,总要两边一起更新
Article art=new Article();; 
article.setTitle("test");; 
article.setContent("this is test");; 

Author au=new Author();; 
au.setAuthorname("lyo");; 

au.addArticle(art);; 
art.setAuthor(au);;//这句必须要写!

session.save(au);; 
0 请登录后投票
   发表时间:2003-12-01  
sorry,我没有说清楚,我的add方法是包括setAuthor这个操作的
public void addArticle(Article art);{
		if(this.getArticle();!=null);{
		this.getArticle();.add(art);;
		art.setAu(this);;
	    }else{
	    	article=new HashSet();;
	    	article.add(art);;
	    	art.setAu(this);;
	    }
	}
	public Set getArticle();{
		return this.article;
	} 
	public void setArticle(Set article);{
		this.article=article;
	}
}


可见正向操作和反向操作都包括了,就是说我在这个add中有setArticle,应该没问题了?
0 请登录后投票
   发表时间:2003-12-01  
sorry,我没仔细看
引用

article的内容没有存入

&lt;set name="article" lazy="true" inverse="true"&gt;

映射改为
&lt;set name="article" lazy="true" inverse="true" cascade="save-update"&gt;

cascade="all"或
cascade="all-delete-orphan",看你的具体要求了
0 请登录后投票
   发表时间:2003-12-03  
多谢,现在可以了,原来是我把inverse和cascade弄错了,我这里应该用cascade
0 请登录后投票
   发表时间:2003-12-03  
那么这里的inverse=true,起了什么作用呢?
0 请登录后投票
   发表时间:2003-12-04  
应该是建立外健和主健关联,比如主表中的foreign key aid和从表中的id
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics