日期:2014-05-20  浏览次数:20653 次

高分请教关于many-to-one 和 one-to-many 成对的问题!
各位,问几个问题,举个例子,还是user和group。它们是多对一的关系。在user表中有groupId的字段,但在group中并没有user的信息。在这种情况下,user的hibernate配置中用了many-to-one,
1. 在group中可以用one-to-many吗?
2. hibernate配置中的字段是不是与数据库要保持完全的一致呢?如果可以不完全一致,则应该就可以在group端加上one-to-many。
3. 那么many-to-one 与 one-to-many 何时才成对出现呢?是不是随时都可以成对,只是看你程序是否需要?

越详细给分越多!谢谢了!

------解决方案--------------------

------解决方案--------------------
个人观点,楼主理解有误.
many-to-one 与 one-to-many 成对出现是什么意思?
在user和group两个相关联的实体类中,你或者在user中用many-to-one
或者在group中用one-to-many 在表示他俩的关系,
所以没有什么成对出现.
在hibernate中一般都是多的一方来维护关系,建议用many-to-one.
hibernate配置中的字段也就是实体bean里的属性可以跟数据库的字段不完全一样,
但是跟"在group端加上one-to-many"没有关系呢.
one-to-many只是来建立两个表之间的关联关系的.
------解决方案--------------------
<many-to-one>标签是表示需要在数据库的表中加外键来表示关系的时候用,顾名思义多对一是多的一方与一的一方的关系。
<one-to-many>标签不用指明关系在数据库中的外键。
这两个标签成对使用的时候是一对多双向关系的时候才用
------解决方案--------------------
但在group中并没有user的信息,这样的话就不需要在group端配置one-to-many,并且你的group没有user属性,拿什么去配置one-to-many?

在group端配置one-to-many 要提供一个包含多个user的属性,
(由于users中要包含多个user对象,所以用set集合):
public class Group
{
private java.util.Set users = new java.util.HashSet();
...相应的getter和setter方法...
}
然后在Group.hbm.xml中配置
<set name="users" lazy="true" inverse="true" cascade="all" > 
<key column="groupid"/> 
<one-to-many class="User"/> 
</set> 

红色部分就是Group类中的Set集合的属性名。



------解决方案--------------------
学习
------解决方案--------------------
学习
------解决方案--------------------
1. 在group中可以用one-to-many吗? 
当然可以

2. hibernate配置中的字段是不是与数据库要保持完全的一致呢?如果可以不完全一致,则应该就可以在group端加上one-to-many。
hibernate映射(注意,不是配置)和数据库的表结构是一致的,但是是从对象角度看问题。
比如,many-to-one,表示user对象持有group对象的引用,表结构中应该是这个表中有一个字段外键关联到另一个表的主键。比如user表有一个叫group_id的字段,是gourp表的外键关联。
我们一般说gourp 表是父表,user表是子表。
既然user可以持有一个group的引用,group应该可以持有多个user的引用。所以从代码中看:
User.java
Java code
private Group group;