Hibernate映射mysql问题 one-to-one

当我们使用hibernate的一对一映射,配置mysql数据库表时:

两表的配置文件如下:

1、tseal:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="com.indigopacific.iessportal.persistent.Seal"
table="tseal" dynamic-update="true" dynamic-insert="true"
select-before-update="false" lazy="false">

<id name="id" column="id" type="long">
<generator class="increment"/>
</id>

<property name="sealName" type="string" column="sealName"
not-null="false" unique="false" />


<one-to-one name="sealData"
class="com.indigopacific.iessportal.persistent.SealData"
cascade="save-update" lazy="proxy">

<set name="sealModels" cascade="save-update" lazy="true"
outer-join="false" inverse="true">
<key column="sealId" />
<one-to-many
class="com.indigopacific.iessportal.persistent.SealModel" />
</set>
<many-to-one name="branchInfo" column="branchInfoId"
class="com.indigopacific.iessportal.persistent.BranchInfo"
cascade="save-update" outer-join="false" lazy="false">
</many-to-one>

</class>

</hibernate-mapping>

2、tsealData

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="com.indigopacific.iessportal.persistent.SealData"
table="tsealdata" dynamic-update="true" dynamic-insert="true"
select-before-update="false" lazy="true">

<id name="id" column="id" type="long">
<generator class="foreign">
<param name="property">seal</param>
</generator>
</id>

<one-to-one name="seal"
class="com.indigopacific.iessportal.persistent.Seal" cascade="save-update" constrained="true"/>

<property name="sealString" type="string" column="sealString"
not-null="false" unique="false" />

</class>
</hibernate-mapping>

如果我们保存tseal表时想同时保存tsealdata表数据,如果写成:

Seal seal = new Seal();
seal.setSealName("seal");
SealData data = new SealData();
data.setSealString("hello");
seal.setSealData(data);

session.save(seal);

会报如下异常:

org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: seal

但是在oracle中不会这样,原因尚待分析。

需要改成如下解决问题:

Seal seal = new Seal();
seal.setSealName("seal");
SealData data = new SealData();
data.setSealString("hello");
seal.setSealData(data);

data.setSeal(seal);

session.save(seal);

并发出如下sql语句:

Hibernate: insert into tseal (sealName, id) values (?, ?)
Hibernate: insert into tsealdata (sealString, id) values (?, ?)

原因是:

当我们保存tseal表时,由于没有提交,导致我们保存tsealdata时将null分配该表记录作为主键,因而报错。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值