[hibernate-issues] [Hibernate-JIRA] Resolved: (HHH-3113) Problem when adding a new Object in unidirectional one-to-many and change the hashCode value of others objects of the collection
Emmanuel Bernard (JIRA)
noreply at atlassian.com
Mon Feb 25 19:15:33 EST 2008
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3113?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Emmanuel Bernard resolved HHH-3113.
-----------------------------------
Resolution: Rejected
Your hashCode implementation broke all the fundamental requirements of this method.
Check the JavaDoc
> 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.5, 3.2.6
> 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