个人观点,楼主理解有误.
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 成对出现是什么意思?
在user和group两个相关联的实体类中,你或者在user中用many-to-one
或者在group中用one-to-many 在表示他俩的关系,
所以没有什么成对出现.
在hibernate中一般都是多的一方来维护关系,建议用many-to-one.
hibernate配置中的字段也就是实体bean里的属性可以跟数据库的字段不完全一样,
但是跟"在group端加上one-to-many"没有关系呢.
one-to-many只是来建立两个表之间的关联关系的.
解决方案 »
- struts2 Action中获得request对象
- Struts-2.1.6整合Tiles2全攻略,遇到问题的朋友进来看下,也许对你有帮助!
- 有java生成报表的代码没。给一份谢谢
- xml Schemade 的问题.建立连接的问题在哪里?
- 求教高手!
- ResultSet有什么类可以转换成XML?
- 用Hibernate3.3.2 this.hibernateTemplate.find查询list返回的都是空元素,求大神
- 在weblogic7.0中,JSP文档应该如何部署。
- 谁能介绍一下子Tiles呀?
- 从后台返回的json数据到页面要不要eval("("+data+")")一下然后在页面展示啊
- hibernate的hql如何根据时间查询出最近100个数据值呢
- 请教各位:struts2中dojo找不到未定义
<one-to-many>标签不用指明关系在数据库中的外键。
这两个标签成对使用的时候是一对多双向关系的时候才用
(由于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集合的属性名。
当然可以2. hibernate配置中的字段是不是与数据库要保持完全的一致呢?如果可以不完全一致,则应该就可以在group端加上one-to-many。
hibernate映射(注意,不是配置)和数据库的表结构是一致的,但是是从对象角度看问题。
比如,many-to-one,表示user对象持有group对象的引用,表结构中应该是这个表中有一个字段外键关联到另一个表的主键。比如user表有一个叫group_id的字段,是gourp表的外键关联。
我们一般说gourp 表是父表,user表是子表。
既然user可以持有一个group的引用,group应该可以持有多个user的引用。所以从代码中看:
User.java
private Group group;Group.java
private Set users;//可以是其他集合类型,如List,Map等从数据库表结构看,主表(group)没有对子表(user)有任何关联,只有子表才对父表有一个外键关联。3. 那么many-to-one 与 one-to-many 何时才成对出现呢?是不是随时都可以成对,只是看你程序是否需要? many-to-one 是一个外键关联,必须出现。当然你也可以用一个简单的属性类型如long,int,String表示。
one-to-many何时使用?看你程序的需要了。什么时候需要?看对象导航。
如果你有一个代码,需要从group端导航到user端,则需要。比如你循环取出group.users中的对象然后干点什么的时候。有个简单的判断标准,如果你页面上不需要分页显示,那就带上,如果需要分页显示,就不要one-to-many。
2.0 “关系标记”有: one-to-one, many-to-one,
set+one-to-many, set+many-to-many
2.1 hibernate mapping中建立的表与表之间的关系和数据库中表与表之间的关系无任何瓜葛,互无影响。
前者暂叫“cfg表关系”或“config 表关系”, 或者叫“db表关系”或“database 表关系”
不过,cfg表关系常常参照db表关系来建立。
2.2 一个关系标记对应一个属性,但该属性表达“表与表的关系”,而不与字段对应。这类属性暂叫“关系属性”
(1)这就表示更新本表的字段时,不考虑这些关系属性;
(2)更新本表的同时,也可能要同时更新关系表,这时关系属性起作用。
2.3 准则:"cfg表关系"没有相互性。
表mainTable 和 表relationTable,
在mainTable的mapping文件中建立与relationTable的many-to-one的"cfg表关系" 。
这不表示relationTable与mainTable有one-to-many的"cfg表关系"
对relationTable的pojo对象进行数据库操作完全不受这个"cfg表关系"影响,就像没有这个关系一样。
对mainTable的pojo对象进行数据库操作,可能会根据这个"cfg表关系"更新mainTable表和relationTable表
这点与"db表关系"不同,比如在mainTable中建立了一个指向relationTable的foreign key,
那么往mainTable中插入一个foreign key 不存在的记录是不容许的,
从 relationTable中删除一条记录,而这条记录mainTable中有记录关联它,那么删除会 导 致 异常。
这条准则很重要。
这表示一个mapping文件中建立的"cfg表关系"不会影响其它mapping文件中的"cfg表关系",
,反过来,它也不受其它mapping文件中的"cfg表关系"的影响。
这意味着一条"cfg表关系的"的作用是可预见的,其作用由它所在的mapping文件确定的。
如果relationTable想与mainTable有one-to-many的"cfg表关系",则需在relationTable的mapping文件中
用oneToMany标记显示地建立这种关系。
extend: 属性inverse=true的"cfg表关系"叫"bidirectional association"(双向关系),这个属性并不会破坏这条准则。
后面会详细 讨 论 inverse属性。
2.4 "cfg表关系"( mainTable -- relationTable );有 以 下 几 种情况:
(1);one-to-one
表mainTable的主键对应relationTable的主键,
多个字段作主键时,按照在mapping文件中字段出现的顺序一一对应(如果字段数不同 会 exception)
eg:配置Teacher表的mapping文件:
<one-to-one name="wife" class="db.Teacher"/> (这个配置的意思是"老师的老婆是一个老师");
(2)many-to-one
这个标记既属于“映射标记”又是“关系标记”。它有update和insert属性即是 明 证。
表mainTable的一些字段对应relationTable的主键
在many-to-one标记中要声明哪些字段对应relationTable的主键
eg:配置schoole表的mapping文件:
<many-to-one name="address" class="db.Address">
<column name="SCHOOLE_ADDRESS"/>
</many>
(school表的字段SCHOOLE_ADDRESS对应address表的key(字段name));
(3); one-to-many + set
表mainTable的主键对应relationTable的一些字段
在many-to-one标记中要声明主键对应relationTable的哪些字段
eg:
配置address表的mapping文件
<set name="schooleSet">
<key>
<column name="SCHOOLE_ADDRESS"/>
</key>
<one-to-many class="db.Schoole"/>
</set>
从(2);和(3);的例子中可看出many-to-one和one-to-many的一些相似:
1.one方的主键和many方的部分字段对应
2.须提供建立对应关系many方所需的字段。
(4)many-to-many + set
需要一张表来记录many-to-many关系, 这张关系表是双方主 键 所 含字段的集合。
在many-to-many标记中要说明“一方主键对应的字段, 多对多关系表, 另一方主键对应的字段”
eg: teacher和student的多对多关系
配置teacher表的mapping文件
<set name="studentSet" table="TEACHER_STUDENT">
<key>
<column name="TEACHER_ID"/>
</key>
<many-to-many class="db.Student">
<column name="CARD_ID"/>
</many-to-many>
</set>
(关系表TEACHER_STUDENT含两个字段:TEACHER_ID, STUDENT_ID)
从(3);和(4);的例子可以看出one-to-many和many-to-many的一些相似性:
1. 结 构 相 似,key子标记都提供了主 键 所 对应的它表的字段
2.由于多了一个关系表,所以set标记多了属性table
3.由于relationTable也要声明它的主 键 所对应的它表的字段,故many-to-many标记多了column属性
这四个标记都有一个共同的任务:将双方的部分字段一一对应起来(many-to-many由于关系表的出现,字段的
对应也是一一对应的),就好像架起一座桥,桥的左边是mainTable的字段,桥的右边是relationTable的字段,
把这部分字段叫做“桥字段”,字段对应的属性是“桥属性”。桥字段与普通的字段的区别是,
hibernate要保证mainTable与relationTable中对应的桥字段的值相等。
2.5 在查询一个pojo时,如何 得 到 它的关系属性
关系标记对应的关系属性要么是一个pojo(对one-to-one和many-to-one);, 要么是pojo的集合(对
one-to-many,many-to-many而言);
hibernate在查询时,它会根据关系标记生成一个sql语句,从relationTable中查出满足条件的记录,
然后依照relationTable的mapping文件生成relationTable的pojo.
在2.4中可看出,关系标记已给出两个表的字段是如何对应,hibernate可精确地生成sql语句。
extend: 由关系属性可能是一个pojo,而一个pojo又可以有 自 己 的关系属性,其结果是hibernate生成一个pojo时,
藉由该pojo的关系属性, 得 到 一个pojo网。这个不难理解,因为hibernate对表间的“cfg表关系”了 然 于 胸。