Hibernate映射mysql问题 one-to-one
2011-11-25 00:12
309 查看
当我们使用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分配该表记录作为主键,因而报错。
这里如果将constrained="true"放到seal的hibernate mapping文件中保存时会报如下错误:
Caused by: java.sql.SQLException: Cannot add or update a child row: a foreign key constraint fails (`iess`.`tsealdata`, CONSTRAINT `FKDB17E37BF293309C` FOREIGN KEY (`id`) REFERENCES `tseal` (`id`))
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2926)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1120)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:675)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1162)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1079)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1064)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2197)
... 27 more
两表的配置文件如下:
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分配该表记录作为主键,因而报错。
这里如果将constrained="true"放到seal的hibernate mapping文件中保存时会报如下错误:
Caused by: java.sql.SQLException: Cannot add or update a child row: a foreign key constraint fails (`iess`.`tsealdata`, CONSTRAINT `FKDB17E37BF293309C` FOREIGN KEY (`id`) REFERENCES `tseal` (`id`))
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2926)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1120)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:675)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1162)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1079)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1064)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2197)
... 27 more
相关文章推荐
- Hibernate映射mysql问题 one-to-one
- Hibernate 中annotations(注解开发)的@OneToMany 一对多双向关联映射后,出现的jar包冲突问题
- 关于hibernate中映射中有many to one等外键关联时的问题
- Hibernate映射关系解析(三)--Unidirectional associations--one-to-many
- Hibernate关系映射(四)一对多单向关联@OneToMany Annotation方式
- hibernate与mysql tinyint字段映射问题
- 使用注解的Hibernate one-to-many映射
- hibernate映射文件many-to-one元素属性
- <二>重温Hibernate one to one 映射
- Hibernate的配置文件的映射many-to-one错误
- Hibernate关系映射(二)一对一双向外键关联@OneToOne Annotation方式
- Hibernate one to many 关联关系映射
- hibernate的OneToOne映射等
- hibernate映射文件one-to-one元素属性
- hibernate单向一对多关联映射(one-to-many)XML与注解版
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题(转)
- Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
- Hibernate学习笔记(3)Hibernate映射文件之set key one-to-many
- Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)