Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] ParentChild Insert Problem: Duplicate Key

Hi Tim,

thanks for reply. Yes, something is wrong in my thoughts.

Your first suggestion:
Isn't this what Im doing in PersonEntity? (remindIssue.setPerson(this);)

public void addRemindIssue(RemindIssue remindIssue) {
     remindIssue.setPerson(this); // for bidirectional mapping
     if (this.remindIssueSet == null) {
	...

If I add an existing Issue to a Person, the issue will know to what Person it belongs to.


Your second suggestion:
Well, I do not have a Person object persisted at this time. I just have a bunch of Issues persisted and the new Person object should get some.

You wrote: "

You don't need to break things down so much into every little
granulated persist/merge statement like you ar.e

"

Hmm.. but I need this to understand the backgrounds and why it doesn't work as it should work.

Thank you for answer.

Martin.

Tim Hollosy schrieb:
You are thinking about this wrong, you need to tell Issue which Person
to have, then add it on to person, a proper update will occur.

OR

Obtain the issue from person, then change that issue.

You don't need to break things down so much into every little
granulated persist/merge statement like you ar.e

./tch



On Sat, Aug 29, 2009 at 6:56 AM, Martin Dames<m.dames@xxxxxx> wrote:
Hi,

i have an issue with understanding EclipseLinks persist technique:

If  I have an entity and persisting it twice with JPAs
getEntityManager().persist(entity); method. I get a duplicate key value in a
unique or primary key constraint violation. So, this is fine since the
entity is persisted before.

What about a ManyToOne Relation in this case? Imagine I have two entities
(Person and RemindIssue). I have already a list of RemindIssues persisted in
the DB through JPA. So, I find an object Remindssue and add this to my NEW
Person entity (Person does not exist in db before). Then I persist my Person
Object (I have CASCADE.ALL activated) and I get the same duplicate key
violation since JPA/EclipseLink wants to persist the RemindIssue again. This
should not happen... and I though that the purpose of an ORM is to figure
this out and do an update instead of a perstist of RemindIssue?!?!

So what is wrong in my thoughts? Are ORMs that stupid?

(Using EclipseLink 1.1.2 with JPA and Derby Embedded, Java 6)


Here are some code snippets:

Person:
@Entity
public class Person extends BaseEntity<Long> {
    private String  salutation;
      ....
  @OneToMany (mappedBy = "person", cascade = {CascadeType.ALL})
  private Set<RemindIssue>    remindIssueSet;

      public void addRemindIssue(RemindIssue remindIssue) {
      remindIssue.setPerson(this); // for bidirectional mapping
      if (this.remindIssueSet == null) {
          this.remindIssueSet = new HashSet<RemindIssue>();
      }
      this.remindIssueSet.add(remindIssue);
  }


RemindIssue:
@Entity
public class RemindIssue extends BaseEntity<Long> {

  // Attributes
      ...
  @ManyToOne(cascade = {CascadeType.ALL})         private Person
 person;




Test class:
      PersonDAO pDAO = new JpaPersonDAO();
      RemindIssueDAO rDAO = new JpaRemindIssueDAO();
            RemindIssue issue = new RemindIssue();
      issue.setComment("AmazingIssue");

      rDAO.persist(issue);
            Person p = new Person();
      p.setSalutation("Mr");
      p.addRemindIssue(issue);
            // for updating the issue
      issue.setComment("StupidIssue");
            // persist the issue as well... no should do an update!
      pDAO.persist(p);


Exception Stacktrace:

...
EL Fine]: 2009-08-29 12:53:13.703--Connection(14823211)--INSERT INTO
REMINDISSUE (OBJECTID, DATEOFACTION, COMMENT, PERSON_OBJECTID,
KIND_OBJECTID) VALUES (?, ?, ?, ?, ?)
[EL Fine]: 2009-08-29 12:53:13.703--Connection(14823211)--      bind => [1,
2009-08-29 12:53:08.625, AmazingIssue, null, null]
[EL Fine]: 2009-08-29 12:53:13.718--Connection(19488744)--INSERT INTO PERSON
(OBJECTID, TELEPHONNO2, ADR_HOUSENO, ADR_COUNTRY, ADR_STREET, ADR_CITY,
LASTNAME, FIRSTNAME, FAXNO, EMAIL, SALUTATION, TELEPHONNO1, ADR_ZIPCODE)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
[EL Fine]: 2009-08-29 12:53:13.718--Connection(19488744)--      bind => [2,
null, null, null, null, null, Dames, Martin, null, null, Herr, 02208/910561,
null]
[EL Fine]: 2009-08-29 12:53:13.718--Connection(19488744)--INSERT INTO
REMINDISSUE (OBJECTID, DATEOFACTION, COMMENT, PERSON_OBJECTID,
KIND_OBJECTID) VALUES (?, ?, ?, ?, ?)
[EL Fine]: 2009-08-29 12:53:13.718--Connection(19488744)--      bind => [1,
2009-08-29 12:53:08.625, StupidIssue, 2, null]
[EL Fine]: 2009-08-29 12:53:13.718--VALUES(1)
[EL Warning]: 2009-08-29 12:53:13.718--Exception [EclipseLink-4002] (Eclipse
Persistence Services - 1.1.2.v20090612-r4475):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.BatchUpdateException: The statement was aborted
because it would have caused a duplicate key value in a unique or primary
key constraint or unique index identified by 'SQL090829125312890' defined on
'REMINDISSUE'.
Error Code: 20000
Exception in thread "main" javax.persistence.RollbackException: Exception
[EclipseLink-4002] (Eclipse Persistence Services - 1.1.2.v20090612-r4475):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.BatchUpdateException: The statement was aborted
because it would have caused a duplicate key value in a unique or primary
key constraint or unique index identified by 'SQL090829125312890' defined on
'REMINDISSUE'.
Error Code: 20000
       at
org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:102)
       at
org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63)
       at birthday.dao.jpa.JpaDAO.commit(JpaDAO.java:99)
       at birthday.dao.jpa.JpaDAO.persist(JpaDAO.java:41)
       at birthday.dao.jpa.JpaDAO.persist(JpaDAO.java:1)
       at birthday.test.TestDAO.main(TestDAO.java:44)
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services -
1.1.2.v20090612-r4475): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.BatchUpdateException: The statement was aborted
because it would have caused a duplicate key value in a unique or primary
key constraint or unique index identified by 'SQL090829125312890' defined on
'REMINDISSUE'.
Error Code: 20000

_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users

_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users



Back to the top