HIBERNATE一对一配置

1. 完全的一对一关系,即A与B两种实体,分两个表格,一对一,A和B的关键字一样,其中一个是父,先产生,另一个是子,后产生,使用要求,就是A和B生成后,一般不再改变关系,也就是说A一般不再将C做为其子,而去除与B的关系,适用情况,比如表格某一部分太大,经常查询需要大量数据流,而将表分开以提高性能,完全一对一关系要求不能更改两者的关系,比如A对应B,一旦要将A的对应关系改成C一般是不允许的,因为C也要和A一样的ID,这样B和C的ID就冲突了,可以测试一下,看会不会冲突
2. <one-to-one
name="propertyName" (1)
class="ClassName" (2)
cascade="all|none|save-update|delete" (3)
constrained="true|false" (4)
outer-join="true|false|auto" (5)
property-ref="propertyNameFromAssociatedClass" (6)
access="field|property|ClassName" (7)
/>
3. (1) name: 属性的名字(2) class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。 (3) cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。 (4) constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺序(也在schema export tool中被使用)。 (5) outer-join(外连接) (可选 - 默认为 自动): 当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。 (6) property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键[POJO中POJO类的实例]。 (7) access (可选 - 默认是 property): Hibernate用来访问属性的策略。
4. One-to-one中不需要inverse,另外完全的一对一关系很严格,两个对象一定同时存在,并且存在以后一般不会再修改,如果修改也不能从主动的一端进行修改了
5. 环境:模拟共享文件系统,Appender,每个附件有个名字和一个文件组成,在此将文件放到另一个表格中(AppenderFile)
6. 配置文件
-----------------------------------------------------------主动者
<hibernate-mapping package="com.softWork.school">
<class name="Appender" table="appender">
<id name="appenderId" column="appender_id" type="long">
<generator class="native"/>
</id>
<property name="appenderTitle" column="appender_title" type="string" length="200"/>

<one-to-one name="appenderFile" class="com.softWork.school.AppenderFile" constrained="false" cascade="all">
</one-to-one>
</class>
</hibernate-mapping>

-------------------------------------------------------------------------------------------被动着
<hibernate-mapping package="com.softWork.school">
<class name="AppenderFile" table="appender_file">
<id name="id" column="id" type="long">
<generator class="foreign">
<param name="property">appender</param>
</generator>
</id>
<property name="fileContent" column="file_content" type="string" length="2000"/>

<one-to-one name="appender" class="com.softWork.school.Appender" constrained="true">
</one-to-one>
</class>
</hibernate-mapping>


7. 几个注意
1) 主动者的constrainted为false,被动者为true,这个关键字主要决定关键字的生成是通过别人来获得还是自己生成
2) 被动者也一定要有主动者的引用以在主动者创建成功后获得其获得的ID。程序执行时,被动者也一定要设置好主动者对象的引用,虽然也可以先不设置,这样在保存主动者的时候,被动者将不会被保存,虽然这样可以达到先创建主动者 ,而后按需要创建被动者,但是这与实际语义不符
3) 不可以通过为主动者设置新的被动者来删除原被动者的值,而增加新的被动者
4) 可以通过主动对象直接修改被动对象的内容后,保存主动对象而直接修改被动对象对应数据库的内容
5) 可以级连删除
6) 一定要先创建主动者再创建被动者

8. 操作程序示范
前提条件是’级连’
/*
1)可以级连保存数据
Appender appender = new Appender();
appender.setAppenderTitle("hello world.");
AppenderFile appenderFile = new AppenderFile();
appenderFile.setFileContent("good action.");
appender.setAppenderFile(appenderFile);
appenderFile.setAppender(appender);
//以下一句将保存所有数据
session.saveOrUpdate(appender);
*/
2)可以通过父对象获取子对象后修改子对象内容,保存父对象,级连更新到子对象
//读取appenderFile对象内容
Appender appender = (Appender)session.load(Appender.class,new Long(4));
/*
appender.getAppenderFile().setFileContent("a sucess man.");
//可以通过父对象修改子对象内容
session.saveOrUpdate(appender);
*/
3)只删除子对象
a.通过设appender.setAppenderFile(null);
session.saveOrUpdate(appender); 无效
b. Appender appender = (Appender)session.load(Appender.class,new Long(1));
AppenderFile appenderFile = appender.getAppenderFile();
session.delete(appenderFile);删除失败
c. Appender appender = (Appender)session.load(Appender.class,new Long(1));
AppenderFile appenderFile = appender.getAppenderFile();
appender.setAppenderFile(null);
session.delete(appenderFile);
session.saveOrUpdate(appender);成功
4)通过为父对象设置新的子对象来修改子对象数据库中内容,操作失败,所以一般的,一对一的操作,因为完全可以通过父对象来设置子对象内容,完全不需要通过更换子对象来更换子表内容
//以下操作失败
Appender appender = (Appender)session.load(Appender.class,new Long(1));
AppenderFile appenderFile = appender.getAppenderFile();
appender.setAppenderFile(null);
AppenderFile newFile = new AppenderFile();
newFile.setFileContent("good man");

appender.setAppenderFile(newFile);
newFile.setAppender(appender);
session.delete(appenderFile);
session.saveOrUpdate(appender);

4)级连删除成功
session.delete(appender);

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/notruiyi/archive/2007/08/13/1740124.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值