用户登录
用户注册

分享至

hibernate中one-to-one

  • 作者: OBM的那个啥
  • 来源: 51数据库
  • 2021-01-28
这个很好理解。
从字面意思上看,one to many 是一对多,many to one是多对一。很明显就是区别(说实话,楼主问这样的问题,我都觉得很诧异,仿佛问黑与白有什么区别一样)。

从实际开发角度来说,一对多反过来就是多对一。我们以学生和班级为例。学生对班级是many to one,班级对学生就是one to many。
那到底我们配置班级方的one to many,还是配置学生方的many to one呢。这个问题就要看实际开发需求了。

在这个需求中,从经验上可以想象,我们查看班级的时候,并不一定要看到每个学生的信息。因为学生很多。
但我们查看学生的时候,可能想看班级的信息,因为一个学生对应一个班级。在这种情况下,我们当然是配置学生方的many to one,然后做级联操作。以便取出学生时取出对应班级。

而事实上,大多数情况下,many to one比one to many的应用也更为防范,这主要是基于一个效率考虑



  补充jvm7572说明一下..Hibernate设置了many to one或者one to many后在你的实体类里面的表现方式是不一样的(具体忘记了.好久没用了)....而且耦合度太高..如果没有特别要求的紧密性质..建议不要用这种关系在Hibernate中...多两行简单的代码.你的性能会提高很多..
//------------p.s.
我感觉你压根没明白1对多和多对1在hibernate中的配置关系...1对多和多对1在建立表关系是比如jvm7572学生和班级就的关系是多对1的.就是1个班级中包含了多个学生.反过来就是多个学生在一个班级中.永远都是学生表中含有班级的主键不可能班级表中出现学生的主键..首先说明下1对多和多对1的意义..减少数据冗余..表明实体和实体之间关系.

在说hibernate中配置. 1对多







类中编码
private java.util.List students;
多对1

private StudentClass studentClass;
不明白的就在看看书吧.书上说的很明白了...上边的配置和类里面的映射参考吧..是可以互换的.但是看你是操作什么的多了.是操作学生的多,还是操作班级的多..简单操作就乘.数据量大就用jdbc.不要为了简单的编码而忽略了性能.
那么one to many和many to one不就是可以互换了吗?是可以互相转换.但不是可以随便转换的.当且仅当one to many和many to one可以互换时,one to many和many to one没有任何区别.怎么做都可以.




  多对一(many -to-one)
一对多(one- to- many)

多对一以及一对多都是相对于对象模型(虽然这种说法来自于数据库,但我觉得多对一,一对多放在对象上说更合适一点)来说的,相关的两个类是组合关系,重点的内容在于多对一关系,[一对多]是对[多对一]得补充(扩充)。

在关系模型中,只能通过外键约束来表示两张表的这种多对一关系。具体在hibernate中的使用应该是先抽象出多对一的这种关系,也就是说Class类中的students属性可以先不用看(在Student类中抽象出class属性即可),类抽象完成后,在配置hibernate的mapping文件的时候,配上many to one 标签即可(many to one 标签的name 属性同样还是配上Student类中的属性class),配上之后,hibernate就是根据配置自动寻找Class类,并且把Class对应的表中的主键在自己的表中以外键形式存在,单从这一点可以看出hibernate的高级之处,只需要设计好类间的关系(对象模型),相关的表(关系模型)就会被创建。这是从表的创建以及插入数据处分析,从查询出分析,当从Student类对应的表中读出外键(Class表对应的主键)之后,根据mapping文件,hibernate又会去查Class类对应的表,并且构造出class的一个对象,结合刚才本表中的数据,那么查出来后就会是一个完整的Student类的一个对象(三个属性齐全)。
可以看出,hibernate可以帮我们屏蔽和数据库间的交道,只需要简单的配置就可以完成在JDBC中比较复杂的操作。
一对多的关系体现的数据库中其实和刚刚的多对一并没有什么变化,变化发生在Class类中多了一个属性(一个Student类型对象的集合),所以说一对多关系是多对一的一个补充,并不是另一种关系模型,多对一该有的操作在一对多中一个都不能少。



  如果你反过来改的话,要出问题了,one to many 是一对多,many to one是多对一。这个是根据你数据映射来的,如果你数据库表里没有设置主外键的话,还是可以的,有时会报一些错..这时你就要还原看看是什么原因造成的,什么原因都有可能哦..



  
补充jvm7572说明一下..hibernate设置了many to one或者one to many后在你的实体类里面的表现方式是不一样的(具体忘记了.好久没用了)....而且耦合度太高..如果没有特别要求的紧密性质..建议不要用这种关系在hibernate中...多两行简单的代码.你的性能会提高很多..
//------------p.s.
我感觉你压根没明白1对多和多对1在hibernate中的配置关系...1对多和多对1在建立表关系是比如jvm7572学生和班级就的关系是多对1的.就是1个班级中包含了多个学生.反过来就是多个学生在一个班级中.永远都是学生表中含有班级的主键不可能班级表中出现学生的主键..首先说明下1对多和多对1的意义..减少数据冗余..表明实体和实体之间关系.

在说hibernate中配置. 1对多
<list name="studentid" cascade="all" lazy="true" inverse="true" table="class_table">
<key>
<column name="student_id" not-null="true"/>
</key>
<one-to-many class="student"/>
</list>

类中编码
private java.util.list<student> students;
多对1
<many-to-one name="studentclass" not-null="true" class="studentclass" column="class_id" cascade="save-update,persist" fetch="join"> </many-to-one>
private studentclass studentclass;
不明白的就在看看书吧.书上说的很明白了...上边的配置和类里面的映射参考吧..是可以互换的.但是看你是操作什么的多了.是操作学生的多,还是操作班级的多..简单操作就乘.数据量大就用jdbc.不要为了简单的编码而忽略了性能.
那么one to many和many to one不就是可以互换了吗?是可以互相转换.但不是可以随便转换的.当且仅当one to many和many to one可以互换时,one to many和many to one没有任何区别.怎么做都可以.
软件
前端设计
程序设计
Java相关