-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: A bug in Hibernate Entity Manager
PostPosted: Tue Jan 15, 2008 6:18 pm 
Newbie

Joined: Thu Jul 26, 2007 2:28 pm
Posts: 9
Hibernate entity manager seemed to have a problem with the following attribute in my class:

Code:
  class Student {
  ...
  @OneToMany
  @JoinTable(
      joinColumns = {@JoinColumn(name = "student_id", referencedColumnName = "id")},
      inverseJoinColumns = {@JoinColumn(name = "course_id", referencedColumnName = "id", unique = false)})
  private Map<Long, Course> skills = new HashMap<Long, Course>();
  ...
  }


As indicated in my annotation, the foreign key "course_id" in the association table "students_courses" (created by Hibernate entity manager automatically) is supposed to be non-unique (i.e., unique=false). But Hibernate kept translating it as unique in generating the SQL code as captured below:

create table students_courses (
students_id bigint not null,
courses_id bigint not null,
mapkey bigint,
primary key (students_id, mapkey),
unique (courses_id)
)

This caused the runtime exception for duplicate foreign key courses_id while I was trying to insert a record of another student having the same courses_id=1 as the other student already existed in the database:

[main] Executing batch size: 1
[main] com.mchange.v2.c3p0.impl.NewPooledConnection@7038b9 handling a throwable.
java.sql.BatchUpdateException: Duplicate entry '1' for key 2

The previous student's record was inserted by first adding the course whose courses_id=1 and then added the that student's record in a non-cascade fashion. Hibernate only threw exception during the second addition of another student with the same courses_id. That's because the foreign key courses_id was created as unique in the join table students_courses.

I checked the table definition in the database. It showed the following layout of attribute types in the join table:

mysql> describe students_courses;
Code:
+-------------+------------+------+-----+---------+-------+
| Field          | Type        | Null  | Key | Default | Extra |
+-------------+------------+------+-----+---------+-------+
| students_id | bigint(20) | NO   | PRI |             |         |
| courses_id  | bigint(20) | NO   | UNI |             |         |
| mapkey      | bigint(20) | NO   | PRI | 0          |         |
+-------------+------------+------+-----+---------+-------+


Is there a way to alter this behavior in Hibernate entity manager? Or is this just another problem that I will have to bear with?

william


Hibernate version:

hibernate-EntityManager3.3.1.GA

Name and version of the database you are using:

mysql-5.0.45-win32.zip

Debug level Hibernate log excerpt:

Code:
[main] Executing batch size: 1
[main] com.mchange.v2.c3p0.impl.NewPooledConnection@7038b9 handling a throwable.
java.sql.BatchUpdateException: Duplicate entry '1' for key 2
   at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269)
   at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955)
   at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
   at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
   at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
   at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
   at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
   at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
   at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
   at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
   at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
   at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
   at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
       


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.