论坛首页 Java版 Hibernate

hibernate入门篇之新增功能_4:many-to-many

浏览 26676 次
该帖已经被评为精华帖
作者 正文
时间:2003-12-25
接上一篇hibernate入门篇之新增功能_3:one-to-many ,我们来介绍一下:many-to-many
Work.java
[code:1]
package com.javamodel.hibernate;

import java.util.HashSet;
import java.util.Set;

public class Work {

private String id = null;
private String title = null;
private Set authors = new HashSet();

public Work(){}


/**
* @return
*/
public Set getAuthors() {
return authors;
}

/**
* @return
*/
public String getId() {
return id;
}

/**
* @return
*/
public String getTitle() {
return title;
}

/**
* @param set
*/
public void setAuthors(Set set) {
authors = set;
}

/**
* @param string
*/
public void setId(String string) {
id = string;
}

/**
* @param string
*/
public void setTitle(String string) {
title = string;
}

}
[/code:1]
work.hbm.xml
[code:1]
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
<class name="com.javamodel.hibernate.Work" table="work" >
<id name="id" column="id">
<generator class="uuid.hex"/>
</id>
<property name="title" column="title" />

<set name="authors" table="author_work" inverse="true">
<key column="work_id"/>
<many-to-many column="author_id" class="com.javamodel.hibernate.Author" />
</set>
</class>
</hibernate-mapping>
[/code:1]
Author.java加上
[code:1]
private Set works = new HashSet();//get,set
[/code:1]
author.hbm.xml加上
[code:1] <set name="works" table="author_work">
<key column="author_id"/>
<many-to-many column="work_id" class="com.javamodel.hibernate.Work" />
</set>
[/code:1]
Example.java
[code:1]
package com.javamodel.hibernate;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.log4j.Logger;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.MappingException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.cfg.Configuration;


public class Example{

private static Logger logger = Logger.getLogger(Example.class);
private static SessionFactory _sessions = null;
private static Properties pops = new Properties();

static{
try {
InputStream stream = Example.class.getResourceAsStream("hibernate.properties");
try {
pops.load(stream);
} catch (IOException e1) {
e1.printStackTrace();
}

Configuration cfg = new Configuration();
cfg.addClass(Person.class);
cfg.addClass(Author.class);
cfg.addClass(Publication.class);
cfg.addClass(Work.class);
cfg.setProperties(pops);
_sessions = cfg.buildSessionFactory();

} catch (MappingException e) {
e.printStackTrace();
} catch (HibernateException e) {
e.printStackTrace();
}

}

public static void main(String[] args) throws HibernateException {

Person person1 = new Person();
person1.setName("HengfeiDo1");
person1.setEmail("smallduzi@sohu.com");

Person person2 = new Person();
person2.setName("HengfeiDo2");
person2.setEmail("smallduzi@sohu.com");

Person person3 = new Person();
person3.setName("HengfeiDo3");
person3.setEmail("smallduzi@sohu.com");

Person person4 = new Person();
person4.setName("HengfeiDo4");
person4.setEmail("smallduzi@sohu.com");

Publication publication1 = new Publication();
publication1.setBookName("AAA");
publication1.setDataTime("20031224");
Publication publication2 = new Publication();
publication2.setBookName("BBB");
publication2.setDataTime("20031225");

Publication publication3 = new Publication();
publication3.setBookName("CCC");
publication3.setDataTime("20031226");
Publication publication4 = new Publication();
publication4.setBookName("DDD");
publication4.setDataTime("20031227");

Publication publication5 = new Publication();
publication5.setBookName("EEE");
publication5.setDataTime("20031228");
Publication publication6 = new Publication();
publication6.setBookName("FFF");
publication6.setDataTime("20031229");

Publication publication7 = new Publication();
publication7.setBookName("GGG");
publication7.setDataTime("20031230");
Publication publication8 = new Publication();
publication8.setBookName("HHH");
publication8.setDataTime("20031231");

Author author1 = new Author();
author1.setAlias("smallduzi");
author1.setPerson(person1);
author1.getPublications().add(publication1);
author1.getPublications().add(publication2);

Author author2 = new Author();
author2.setAlias("adu");
author2.setPerson(person2);
author2.getPublications().add(publication3);
author2.getPublications().add(publication4);

Author author3 = new Author();
author3.setAlias("dududu");
author3.setPerson(person3);
author3.getPublications().add(publication5);
author3.getPublications().add(publication6);

Author author4 = new Author();
author4.setAlias("xiaoduzi");
author4.setPerson(person4);
author4.getPublications().add(publication7);
author4.getPublications().add(publication8);

publication1.setAuthor(author1);
publication2.setAuthor(author1);

publication3.setAuthor(author2);
publication4.setAuthor(author2);

publication5.setAuthor(author3);
publication6.setAuthor(author3);

publication7.setAuthor(author4);
publication8.setAuthor(author4);


Work work1 = new Work();
work1.setTitle("111111");
work1.getAuthors().add(author1);
work1.getAuthors().add(author2);

Work work2 = new Work();
work2.setTitle("222222");
work2.getAuthors().add(author3);
work2.getAuthors().add(author4);

Work work3 = new Work();
work3.setTitle("333333");
work3.getAuthors().add(author1);
work3.getAuthors().add(author2);

Work work4 = new Work();
work4.setTitle("444444");
work4.getAuthors().add(author3);
work4.getAuthors().add(author4);

author1.getWorks().add(work1);
author1.getWorks().add(work3);
author2.getWorks().add(work2);
author2.getWorks().add(work4);


Session session = _sessions.openSession();

Transaction tx = null;
try{
tx = session.beginTransaction();
session.save(author1);
session.save(author2);
session.save(author3);
session.save(author4);
session.save(work1);
session.save(work2);
session.save(work3);
session.save(work4);
tx.commit();
System.out.println("---over---");
}catch(HibernateException he){
if(tx != null) tx.rollback();
throw he;
}
finally{
session.close();
}

}

}
[/code:1]
例子写的比较罗嗦。
参考:
Hibernate2 Reference Documentation Version 2.1.1 P116
   
时间:2003-12-26
我不知道你有没有测试过,这段程序可能有问题:

1 双向的many-to-many肯定要有一端设置为inverse="true",另一端为inverse="false"(默认)

2 你没有设置cascade="save-update",这在insert时十有八九要违反外键约束,不要告诉我你用的是mysql myisam。

3 既然是双向的many-to-many,那一定要保持两端同时更新,即
work.getAuthors().add(author);
author.getWorks().add(work);
一定要成对出现。
   
0 请登录后投票
时间:2003-12-26
1.不清楚,我侧过的没有问题。
2.没有设置,数据库用的oracle8.1.7。但是能保存进去。
3. 不成对也不能保存。
多谢你提出的宝贵意见,做事要严谨些。我没有设置外键(偷懒)。
   
0 请登录后投票
时间:2003-12-26
如果还有什么不当之处,请忙上指正。我可不想误人子弟。
如果有什么不当之处,我先在这里说一声:“对不起了”。
   
0 请登录后投票
时间:2003-12-26
你的程序在我这是通不过的,连接表主键从突,这是因为你没有设置一端为inverse="true"的缘故。
   
0 请登录后投票
时间:2003-12-26
谢谢yehs220的认真测试。忙上改
   
0 请登录后投票
时间:2003-12-26
不过很奇怪,我这里还是可以通过的。
   
0 请登录后投票
时间:2003-12-29
这个例子我有一些疑问,除了第3的publication的问题之外,在执行的时候,还有
net.sf.hibernate.JDBCException: could not insert collection: [com.javamodel.hibernate.Author.works#40288095f9c21a2200f9c21a29b20001]Caused by: java.sql.SQLException: General error, message from server: "Table 'hibernate.works' doesn't exist"
由于我是用 SchemaExport 建立tables的,所以才有这个问题吧,不知道如何解决这个问题呢?
虽然在执行的时候出现问题,但是我的资料库里头有
author,person,publication,work 4个tables,而work里头也有资料呢。真是神奇!!而publication呢,则和第3个例子一样,没有资料在里面的,要session.save(publication1);之后才有。
......
另外还有一个问题,如果我要把其中一个author的资料全部列出来,那应该怎样做阿??我用session.load()总是失败。
   
0 请登录后投票
时间:2004-01-12
比如说,Author1参加Work1的时间是2003.4.24日,我想记录这个时间
,应当记录在中间表里面,能否使用many-to-many
   
0 请登录后投票
时间:2004-01-15
author.hbm.xml 如下:[code:1]
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
<class name="com.javamodel.hibernate.Author" table="author" >
<id name="id" column="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="alias" column="alias" />
<one-to-one name="person" class="com.javamodel.hibernate.Person" cascade="all" constrained="true" />
<set name="publications" lazy="true" inverse="true" cascade="all" >
<key column="authorid"/>
<one-to-many class="com.javamodel.hibernate.Publication" />
</set>
<set name="works" table="author_work" inverse="true">
<key column="author_id"/>
<many-to-many column="work_id" class="com.javamodel.hibernate.Work" />
</set>

</class>
</hibernate-mapping>
[/code:1]
work.hbm.xml如下:[code:1]<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
<class name="com.javamodel.hibernate.Work" table="work" >
<id name="id" column="id">
<generator class="uuid.hex"/>
</id>
<property name="title" column="title" />

<set name="authors" table="author_work" inverse="true">
<key column="work_id"/>
<many-to-many column="author_id" class="com.javamodel.hibernate.Author" />
</set>
</class>
</hibernate-mapping>
[/code:1]
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐