Hibernate中的"Repeated column in mapping for entity"异常

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

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

Java代码

  1. public class Item {

  2. private int id;  
  3. private String name;  
  4. private Set bids = new HashSet(); 
  5. ??? 
  6. }

Bid类:

Java代码

  1. public class Bid {

  2. private int id;  
  3. private double amount;  
  4. private Item item; 
  5. ??? 
  6. }

Item.hbm.xml:(t_item表)

Java代码

  1. <hibernate-mapping>

  2. ??? 
  3. <set name="bids" table="t_bid" cascade="save-update"> 
  4. <key column="item_id" not-null="true"/> 
  5. <one-to-many class="value.Bid"/> 
  6. </set>  
  7. ???  
  8. </hibernate-mapping>

Bid.hbm.xml: (t_bid表)

Java代码

  1. <hibernate-mapping>

  2. ??? 
  3. <many-to-one name="item" class="value.Item" column="item_id" not-null="true" />  
  4. ??? 
  5. </hibernate-mapping>

测试代码:

Java代码

  1. ???

  2. Item item = new Item(); 
  3. item.setName("item"); 
  4. Bid b1 = new Bid();

  5. b1.setAmount(12.09);  
  6. b1.setItem(item); 
  7. Bid b2 = new Bid();

  8. b2.setAmount(11.98);  
  9. b2.setItem(item); 
  10. Set bids = new HashSet();

  11. bids.add(b1); 
  12. bids.add(b2); 
  13. item.setBids(bids);

  14. session.beginTransaction();

  15. session.save(item);  
  16. session.getTransaction().commit();

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

Java代码

  1. Exception in thread "main" java.lang.ExceptionInInitializerError

  2. ??? 
  3. 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"限制。

时间: 2024-10-27 02:14:31

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

org.hibernate.MappingException: Repeated column in mapping for entity: com.boot.entity.RepEntity column: rep_batch (should be mapped with insert=&quot;false&quot; update=&quot;false&quot;)

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.boot.entity.RepEntity column: rep_batch (should be mapped with insert="false" update="false") at org.hibernate.mapping.PersistentClass.checkColumnDup

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

近期用JPA遇到这样一个问题:Repeated column in mapping for entity: com.ketayao.security.entity.main.User column: org_id (should be mapped with insert="false" update="false") 这个错误是由实体类引起的.我一開始是这样写的: @Column private long orgId; @ManyToOne @JoinColumn

玩转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: org_id (should be mapped with insert="false" update="false") 这个错误是由实体类引起的,我一开始是这样写的: @Column private long orgId; @ManyToOne @JoinColumn

hibernate中&ldquo;deleted object would be re-saved by cascade&rdquo;异常原理和解决方案

    在hibernate中,经常会出现one to many的关系,如果在不删除one端的前提下要删除many端的某一条或某几条记录,就可能出现上述的异常.     该异常的原理是因为one 端和 many端的联系没有切断,必须要切断他们之间的联系才能进行删除.     方法:     Student s =  studentDao.findById(1);     School.getStudents().remove(s);     s.setSchool(null);     stue

Hibernate中的注解说明

Hibernate中注解注解比较多,常用的也就那么几个,在这里把Hibernate中的注解汇总总结一下. @Entity:将一个类声明为一个实体bean,即一个持久化POJO; @Id:声明bean的标识属性,即和表中的主键对应的属性: @Table:声明bean映射数据库中指定的表: @Column:声明bean的属性到表的列的映射,该注解还有以下属性: name:可选,属性要映射的列明,如果属性名和列名相同则可以省略: unique:可选,是否在该列上设置唯一约束,默认值为false: nu

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

在利用注解开发数据库持久层以前,需要学习一个规范JPA(Java Persistence API),这也是SUN公司提出的数据库的持久化规范.就类似于JDBC,Servlet,JSP等规范一样.而Hibernate框架就实现了此规范,我们可以通过注解和配置文件来实现此规范.前边的学习都是建立在配置文件的基础上,而注解开发现在也处于一种趋势,毕竟它大大提高了开发速度. 看一下注解在Hibernate框架中的开发知识. 一,首先需要导入支持注解开发的jar包: hibernate-annotatio

Hibernate中调用带有underscore的Column Name

Hibernate中默认的NamingStrategy不支持调用带有下划线的column name.在hibernate的bean中必须使用camel case.使用ImprovedNamingStrategy可以使hibernate成功map到带有下划线的column name.代码如下: 1. Configure文件 public static SessionFactory getSessionFactory() { if (sessionFactory == null) { Configu

hibernate中对于数据库的Text注解出现 No Dialect mapping for JDBC type: -1解决方法

hibernate中对于数据库的Text数据类型不支持. hibernate 使用hql查询包含text类型字段的时候很好.如果使用native sql也就是使用  createSQLQuery方法查询text类型的时候总是报错: org.hibernate.MappingException: No Dialect mapping for JDBC type:-1 atorg.hibernate.dialect.TypeNames.get(TypeNames.java :56) 是hiberna

Hibernate中的映射关系(一对多)

在数据库中表和表之间的关系有几种,下面就详细说一下在Hibernate中怎样映射一对多的关系 Hibernate映射一对多的关系,其实就是持久类之间的映射,那如何把持久类关联起来呢??那就用到.hbm.xml文件的<many-to-one>标签了 具体做法如下: 新建一个customer类: package com.jeremy.hibernate.app.example; public class Customer { private Integer customerId; private