[hibernate-issues] [Hibernate-JIRA] Created: (HHH-3113) Problem when adding a new Object in unidirectional one-to-many and change the hashCode value of others objects of the collection

Claudio (JIRA) noreply at atlassian.com
Sun Feb 17 18:23:34 EST 2008


Problem when adding a new Object in unidirectional one-to-many and change the hashCode value of others objects of the collection   
-----------------------------------------------------------------------------------------------------------------------------------

                 Key: HHH-3113
                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3113
             Project: Hibernate3
          Issue Type: Bug
          Components: core
    Affects Versions: 3.2.6, 3.2.5
         Environment: Hibernate Core 3.2.5.GA, Hibernate Annotations 3.3.0.GA and Hibernate EntityManager 3.3.1.GA
Mysql Database 5.0
            Reporter: Claudio
            Priority: Blocker
         Attachments: TestOneToMany.zip

My application has two Entities: User and Phone. The User has a unidirectional one-to-many (join table) with Phone. 
The list of my classes:

@Entity
public class User implements Serializable {
	
  private static final long serialVersionUID = 0L;
  private Long id;
  private Set<Phone> phones = new HashSet<Phone>();
	
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  public Long getId() {
    return id;
  }
	
  public void setId(Long id) {
    this.id = id;
  }
	
  @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
  public Set<Phone> getPhones() {
    return phones;
  }
	
  public void setPhones(Set<Phone> phones) {
    this.phones = phones;
  }
	
  public void addPhone(Phone p){
    if (phones.size()==0) {
      // Assert the first phone is main phone
      p.setMain(true);
    }
    else {
      // There are others phone
      if (p.isMain()){
        // Remove the main of others phones
        for(Phone temp : phones){
          temp.setMain(false);
        }
      }
    }
    phones.add(p);
  }
	
  public String toString(){
    return "User - Set Phones: "+phones;
  }

}

@Entity
public class Phone implements Serializable {
	
  private static final long serialVersionUID = 0L;
  private Long id;
  private String number;
  private boolean main;
	
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  public Long getId() {
    return id;
  }
	
  public void setId(Long id) {
    this.id = id;
  }
	
  public String getNumber() {
    return number;
  }
	
  public void setNumber(String number) {
    this.number = number;
  }
	
  public boolean isMain() {
    return main;
  }
	
  public void setMain(boolean main) {
    this.main = main;
  }
	
  // Overwrite equals
  public boolean equals(Object o){
    if (this == o) return true;
    if (!(o instanceof Phone)) return false;
    Phone temp = (Phone)o;	
    if (!number.equals(temp.getNumber())) return false;
    if (main != temp.isMain()) return false;	
    return true;
  }
	
  // Overwrite hashCode
  public int hashCode(){
    return 29 * number.hashCode() + 29 * (main?1:0);
  }

}

When I create the first Phone, call addPhone method of the User and persist the User, the code works.
But when I create the second Phone and call addphone method of the User, the hashCode value of the first
Phone change because of the overwrite of hashCode in Phone class. When I persist the User with two Phones, 
the Hibernate try to do two inserts in join table (User_Phone). But the one insert has been do in first persist 
of User. I got this Exception:

Exception in thread "main" javax.persistence.RollbackException: Error while commiting the transaction
  at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
  at test.Test.mergeUser(Test.java:23)
  at test.Test.main(Test.java:59)
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
  at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
  at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
  at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
  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)
  ... 2 more
Caused by: java.sql.BatchUpdateException: Duplicate entry '1-1' for key 1
  at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1237)
  at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:936)
  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)
  ... 10 more

The Hibernate should do only one insert in table User_Phone. But it tries to do two inserts. It seems be a bug.
I did a test code. It is attachment in Jira.
I tried to run this code with Hibernate Core 3.2.5.GA and Hibernate Core 3.2.6.GA, but the problem occurs in both.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the hibernate-issues mailing list