转:http://lijiejava.iteye.com/blog/786535

一对多双向关联(类Item与类Bid):

Item类:

public class Item {
private int id;
private String name;
private Set bids = new HashSet();
•••
}

Bid类:

public class Bid {
private int id;
private double amount;
private Item item;
•••
}

Item.hbm.xml:(t_item表)

<hibernate-mapping>
•••
<set name="bids" table="t_bid" cascade="save-update">
<key column="item_id" not-null="true"/>
<one-to-many class="value.Bid"/>
</set>
•••
</hibernate-mapping>

Bid.hbm.xml: (t_bid表):

<hibernate-mapping>
•••
<many-to-one name="item" class="value.Item" column="item_id" not-null="true" />
•••
</hibernate-mapping>

测试代码:

•••
Item item = new Item();
item.setName("item"); Bid b1 = new Bid();
b1.setAmount(12.09);
b1.setItem(item); Bid b2 = new Bid();
b2.setAmount(11.98);
b2.setItem(item); Set bids = new HashSet();
bids.add(b1);
bids.add(b2); item.setBids(bids); session.beginTransaction();
session.save(item);
session.getTransaction().commit();

这是以前的一个"一对多双向关联",今天运行时抛出了如下异常:

Exception in thread "main" java.lang.ExceptionInInitializerError
•••
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: value.Bid column: item_id (should be mapped with insert="false" update="false")

仔细检查了映射文件,发现在Item.hbm.xml配置文件的<key>元素中多了一个not-null="true"限制,将其去掉后就可以正常运行。

(1) 加入not-null="true"意味着什么?


由<key>元素定义的列映射item_id是t_bid表的外键列。加入not-null="true"之后,意味着如果要增加t_bid表中的记录,那么外键列item_id一定不能为null,Item端为了确保item_id字段不为null(Item端不知道Bid端的情况,所以它不可能依赖Bid端来确保item_id不为空),会在t_bid的插入语句中为该字段赋值。
事实上,不论是单向一对多还是双向一对多,只要在<key>元素中设置了not-null="true",那么在t_bid表的insert语句中都会增加column属性所指定的列(此处即item_id),以此确保item_id列不为空。以单向一对多关联为例:如果未设定not-null="true",那么输出的语句为:Hibernate: insert into t_bid (amount) values (?);而如果设定了not-null="true",那么输出的语句就是:Hibernate: insert into t_bid (amount, item_id) values (?, ?) 。

(2) 抛出异常的原因?


异常的原因可以从异常信息中看出,即字段重复。通过(1)中的分析,可以很清楚地明白其中的原因。查看Bid.hbm.xml映射文件:
<many-to-one name="item" class="value.Item" column="item_id" not-null="true" />
可以看出,这是一个多对一关联,not-null="true"表明一个Bid肯定有其对应的Item实体。column属性指定t_bid表中item_id列是t_item表主键的一个外键。对于Bid而言,不论是否指定了not-null="true",它的insert语句都会为item_id字段赋值,即使为null。这就是异常产生的原因,这样的设置会使Hibernate发出类似 insert into t_bid (item_id,item_id) values (•••)的语句,所以会提示重复字段异常。

(3) 解决:


1. 把<key>元素中的not-null="true"去掉,事实上在双向关联中根本不需要由Item端来确保外键列item_id不为null。
2. 可以按照提示,在Bid.hbm.xml映射文件中加入insert="false" update="false"。
加入这两个限制,意味着对t_bid表的insert与update操作中不包含这个字段,这样可避免重复。
3. 在Item.hbm.xml中的<set>元素内加入inverse="true",将关联关系全部交给Bid端。http://lijiejava.iteye.com/blog/776587
4. 最无聊的方法:将<key>元素中的column值改成item_id_1等,不与item_id重复,这样会导致数据表字段的冗余,不应该使用。
在实际应用中,不应该在<key>中加入not-null="true"限制。

Hibernate中的"Repeated column in mapping for entity"异常的更多相关文章

  1. Java EE之Hibernate异常总结org.hibernate.MappingException: Repeated column in mapping for entity:

    解决方案/原因: 一个pojo(JavaBean)中不能有两个属性同时映射到一个数据库字段上 即使是一个属性的两个getter方法也不行 %%%% Error Creating SessionFact ...

  2. 由异常:Repeated column in mapping for entity/should be mapped with insert="false" update="false 引发对jpa关联的思考

    由异常:Repeated column in mapping for entity/should be mapped with insert="false" update=&quo ...

  3. 玩转JPA(一)---异常:Repeated column in mapping for entity/should be mapped with insert="false" update="fal

    最近用JPA遇到这样一个问题:Repeated column in mapping for entity: com.ketayao.security.entity.main.User column: ...

  4. 玩转JPA(一)---异常:Repeated column in mapping for entity/should be mapped with insert=&quot;false&quot; update=&quot;fal

    近期用JPA遇到这样一个问题:Repeated column in mapping for entity: com.ketayao.security.entity.main.User column: ...

  5. 错误解决Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: pers.zhb.domain.Student column: classno (should be mapped with insert="false" update="false")

    1.在学习hibernate的一对多多对一关系的时候,出现了一下错误: 2.错误原因: 这是因为在配置student.hbm.xml的配置文件的时候出现了将两个属性映射到同一个字段: <?xml ...

  6. Annotation(二)——Hibernate中注解的开发

    在利用注解开发数据库持久层以前,需要学习一个规范JPA(Java Persistence API),这也是SUN公司提出的数据库的持久化规范.就类似于JDBC,Servlet,JSP等规范一样.而Hi ...

  7. Hibernate中注解的开发

    转自:https://blog.csdn.net/liujiahan629629/article/details/22335563 在利用注解开发数据库持久层以前,需要学习一个规范JPA(JavaPe ...

  8. Hibernate中调用带有underscore的Column Name

    Hibernate中默认的NamingStrategy不支持调用带有下划线的column name.在hibernate的bean中必须使用camel case.使用ImprovedNamingStr ...

  9. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. (一)学习MVC之制作验证码

    制作验证码的方法在@洞庭夕照 看到的,原文链接:http://www.cnblogs.com/mzwhj/archive/2012/10/22/2720089.html 现自己利用该方法制作一个简单的 ...

  2. Peer to Peer File Sharing Through WCF

    http://www.codeproject.com/Articles/614028/Peer-to-Peer-File-Sharing-Through-WCF https://github.com/ ...

  3. Android视图SurfaceView的实现原理分析

    http://blog.csdn.net/luoshengyang/article/details/8661317

  4. SGU 390-Tickets(数位dp)

    题意:有标号l-r的票,要给路人发,当给的票的编号的各数位的总和(可能一个人多张票)不小k时,才开始发给下一个人,求能发多少人. 分析:这个题挺难想的,参考了一下题解,dp[i][sum][left] ...

  5. 【opencv】图像细化

    [原文:http://blog.csdn.net/qianchenglenger/article/details/19332011] 在我们进行图像处理的时候,有可能需要对图像进行细化,提取出图像的骨 ...

  6. 第一天CSS实战培训及笔记及感想

    首先,我很激动...... 3点了,凌晨3点了,我居然还没睡.总共不到3个小时的视频消化了6个小时,今天是培训班第一天,一下子就来高强度的讲课,整个上过基础班的都听得东倒西歪,更别说我这个没上基础班滴 ...

  7. C#中使用DLL文件

    首先,我们需要在C++程序中导出DLL文件.我使用的是Visual Studio开发,把项目"属性"中的“配置类型”改为"动态库dll",然后添加如下导出代码: ...

  8. EasyBCD安装CentOS双系统

    之前使用CentOS安装过ubuntu,今天安装一次CentOS6.6,要复杂一些,列文备忘. 1.安装EasyBCD,下载CentOS-6.6-x86_64-bin-DVD1.iso.CentOS- ...

  9. IEnumerable、IEnumerator与yield的学习

    我们知道数组对象可以使用foreach迭代进行遍历,同时我们发现类ArrayList和List也可以使用foreach进行迭代.如果我们自己编写的类也需要使用foreach进行迭代时该怎么办呢? IE ...

  10. Sql sp_executesql 参数问题

    DECLARE @name NVARCHAR(30), @sql NVARCHAR(300)set @sql= N'SELECT TOP 1 @n=EmpName from dbo.Emp' exec ...