2009-11-18 90 views
1

我正面临着一些您已经讨论过的问题,并且很抱歉再次提出这个问题。多对多(自引用问题)vs双人一对多

这就像我还没有得到hibernate的某些方面。我正在使用maven2,hibernate 3.2.5 ga,spring 2.6.5 SEC01,hsqldb 1.8.0.10,netbeans 6.7.1

我正在建立用户和联系人管理,并且我设法在我的环境中与“联系人”和“群组pojo”建立了工作“多对多”关系,但是没有登录到hsqlmysql 5.0.51一个本地测试服务器。因为我不想尝试双重一对多关联,所以我想通过引入中间模型来询问关于该映射的几件事情。

现在,这里是我的映射(我已经张贴只是要避免长岗)

//UserAccount POJO 

@OneToMany(targetEntity=PhoneImpl.class, cascade= {CascadeType.ALL}) 
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
private Set<Phone> phones = new HashSet<Phone>(); 

@OneToMany(targetEntity=ContactImpl.class, cascade={CascadeType.ALL}, mappedBy="userAccount") 
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
private Set<Contact> contacts = new HashSet<Contact>(); 

@OneToMany(targetEntity=GroupImpl.class, cascade={CascadeType.ALL}, mappedBy="userAccount") 
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
private Set<Group> groups = new HashSet<Group>(); 


//Contact POJO 

@ManyToOne(targetEntity=UserAccountImpl.class) 
@JoinColumn(name="USER_ACCOUNT_ID",nullable=false) 
private UserAccount userAccount; 

@OneToMany(targetEntity=PhoneImpl.class, cascade={CascadeType.ALL}) 
private Set<Phone> phones = new HashSet<Phone>(); 

@ManyToMany(targetEntity=GroupImpl.class, mappedBy="contacts") 
private Set<Group> groups=new HashSet<Group>(); 


//Group POJO 
@ManyToOne(targetEntity=UserAccountImpl.class) 
@JoinColumn(name="USER_ACCOUNT_ID",nullable=false) 
private UserAccount userAccount; 

@ManyToMany(targetEntity=ContactImpl.class,cascade={CascadeType.PERSIST, CascadeType.MERGE}) 
@JoinTable(name="GROUP_CONTACT_MAP", joinColumns={@JoinColumn(name="GROUP_ID")}, 
inverseJoinColumns={@JoinColumn(name="CONTACT_ID")}) 
private Set<Contact> contacts = new HashSet<Contact>(); 

所以这个工作正常在我的机器上HSQLDB和我的本地MySQL但是它不是本地相同这里使用相同的MySQL 5.0.SO测试服务器是我的问题:

在本地测试服务器上有一个自引用外键作为group.I've了解循环引用到联系很好,但真的不知道这里是否属于这种情况。在映射中可以找到任何可能产生的东西这种自我引用外键。或者我没有避免循环引用的东西?

2.我正在使用Manning java持久化与hibernate这是一本很好的书,从那里我开始练习使用hibernate.in这本书是一个双重的一对多关联让我们说我的情况与中介模式之间的联系与团体之间。我只是不知道如何在实践中使用它,因为我想切换到这种方法。

2.1所以我主要担心的是如何获取所有在一个组中的联系人和联系人所在的所有组?我看不清楚。

2.2如果采用这种方法,联系人和组之间的互相引用将如何?会互相忽视吗?也许这些都是基本的体验,像你这样的java代码编写人员,所以请原谅我的无知,如果你能对此有所了解,我会非常高兴。

感谢您的阅读!

+0

编辑了这篇文章。如果你们中的一些人无法理解,感谢那些试图编辑它的人。现在我认为它更清晰,所以现在我会等待你的想法 – 2009-11-18 08:32:23

回答

1

的一些想法:

0:你确定你已经改变了使用HSQLDB和MySQL之间的休眠的方言?

1:我想你可以期待一个例外,如果你有一个无法解决的/循环引用

2 **:你会创建一个名为ContactToGroup新的类,它会有一个contact场和group场,其中每个是一个多对一结束。 ContactGroup类都有一组contactToGroup。你可以查询它想:

from Contact c 
left join fetch c.contactToGroupSet joinTable 
left join fetch joinTable.Group 

这将会给你所有他们通过ContactToGroup对象连接套组的联系人。

一起创建Contact,ContactToGroup和Group对象也可以让你写入这些表。

祝你好运!

+0

谢谢你。对于** 0 **问题,我具有mysql,derby和hsql的单独属性文件,如mysql.hibernate.properties和mysql.jdbc.properties。对于问题** 1 **肯定会中断测试,我可以在联系表引用联系人(contact_id)中看到外键。对于你的建议,我会试一试,看看我能不能管理它。谢谢 – 2009-11-19 19:29:07