Hi, Eli,
   It seems that you want to have pactId as a primary key and join column in 
the assigned_activities (child) table, and you want the pactId automatically 
generated in the project_activities (parent) table to fill in the pactId column 
(it is a primary key column) in the child table. I got the following error when 
trying to persist an Activity entity with two AssignedActivity objects to the 
database because PACT_ID column is both a primary key column and a foreign key 
column:

<openjpa-0.0.0-rnull fatal user error> 
org.apache.openjpa.util.InvalidStateException: Attempt to set column 
"ASSIGNED_ACTIVITIES.PACT_ID" to two different values: (class 
java.lang.Integer)"0", (class java.lang.Integer)"7" This can occur when you 
fail to set both sides of a two-sided relation between objects, or when you map 
different fields to the same column, but you do not keep the values of these 
fields in synch.


The workaround is not to use IdClass. Instead, to have consId alone as the 
primary key in the child table and pactId as the join column (foreign key 
column) in the child table. Hope this is helpful.

Fay


--- On Wed, 11/19/08, piltrafeta <[EMAIL PROTECTED]> wrote:

> From: piltrafeta <[EMAIL PROTECTED]>
> Subject: Re: @OneToMany/@ManyToOne, Bidirectional, Composite Key
> To: users@openjpa.apache.org
> Date: Wednesday, November 19, 2008, 9:38 AM
> Hi Fay,
> I've done the modification you told me but it's
> still not working... when i
> insert new registers the pactId from assignedActivities
> remains null.
> 
> I copy the class activity with the modification:
> 
> @Entity
> @Table (name="PROJECT_ACTIVITIES")
> @SequenceGenerator(name = "SEQ_PACT_ID",
> sequenceName = "SEQ_PACT_ID",
> allocationSize = 1)
> public class Activity implements IsSerializable{
>       @Id
>       @Column(name="PACT_ID", nullable=false)
>       @GeneratedValue(strategy = GenerationType.SEQUENCE,
> generator =
> "SEQ_PACT_ID")
>       private Integer id = null;
>       @Column(name="PACT_DESC")
>       private String desc = null;
>       @Column (name ="STATE")
>       private Integer state = null;
>       
>       @Column (name ="PROJ_ID")
>       private Integer idProject = null;
>       
>       @Column (name ="PACT_DUE_DATE")
>       private Date dueDate = null;
>       
>       @OneToMany (mappedBy="activity", fetch =
> FetchType.LAZY)
>       @JoinColumn (name = "PACT_ID", nullable = false)
>       @Cascade({CascadeType.ALL,CascadeType.DELETE_ORPHAN})
>       private Set<AssignedActivity> assignedTo = new
> HashSet<AssignedActivity>();
> ..}
> 
> Regards,
> Eli
> 
> 
> Fay Wang wrote:
> > 
> > Hi,
> >    In your test case, you have OneToMany relation from
> Activity to
> > AssignedActivity. The mappedBy attribute in the
> OneToMany relation should
> > be the name of the many-to-one field in the related
> entity that maps this
> > bidirectional relation. Could you change mappedBy to
> "activity" and try
> > again?
> > 
> > Regards,
> > Fay
> > 
> > 
> > 
> > 
> > 
> > --- On Tue, 11/18/08, piltrafeta
> <[EMAIL PROTECTED]> wrote:
> > 
> >> From: piltrafeta <[EMAIL PROTECTED]>
> >> Subject: Re: @OneToMany/@ManyToOne, Bidirectional,
> Composite Key
> >> To: users@openjpa.apache.org
> >> Date: Tuesday, November 18, 2008, 11:56 AM
> >> Hi!
> >> I'm having a similar problem for a while,
> maybe you can
> >> help me...
> >> My classes are like this :
> >> 
> >> @Entity
> >> @Table(name = "ASSIGNED_ACTIVITIES")
> >> @IdClass(AssignedActivityPk.class)
> >> public class AssignedActivity implements
> IsSerializable {
> >>    @Id 
> >>    @Column (name = "CONS_ID",
> nullable=false)
> >>    private Integer consId;
> >>    @Id 
> >>    @Column (name = "PACT_ID",
> nullable=false)
> >>    private Integer pactId;
> >>    @Column (name = "TYPE")
> >>    private Integer type;
> >>    @Column (name = "ASG_EST_TIME")
> >>    private Integer asgEstTime;
> >>    @ManyToOne
> >>    @JoinColumn (name = "PACT_ID",
> nullable=false,
> >>                    insertable = false, updatable = false)
> >>    private Activity activity;
> >> ...}
> >> 
> >> @Embeddable
> >> public class AssignedActivityPk implements
> Serializable {
> >>    @Id 
> >>    @Column (name = "CONS_ID",
> nullable=false)
> >>    private Integer consId;
> >>    @Id 
> >>    @Column (name = "PACT_ID",
> nullable=false)
> >>    private Integer pactId;
> >> ...}
> >> 
> >> @Entity
> >> @Table (name="PROJECT_ACTIVITIES")
> >> @SequenceGenerator(name = "SEQ_PACT_ID",
> >> sequenceName = "SEQ_PACT_ID",
> >> allocationSize = 1)
> >> public class Activity implements IsSerializable{
> >>    @Id
> >>    @Column(name="PACT_ID", nullable=false)
> >>    @GeneratedValue(strategy =
> GenerationType.SEQUENCE,
> >> generator =
> >> "SEQ_PACT_ID")
> >>    private Integer id = null;
> >>    @Column(name="PACT_DESC")
> >>    private String desc = null;
> >>    
> >>    @OneToMany (mappedBy="pactId", fetch =
> >> FetchType.LAZY)
> >>    @JoinColumn (name = "PACT_ID", nullable
> = false)
> >>
>       @Cascade({CascadeType.ALL,CascadeType.DELETE_ORPHAN})
> >>    private Set<AssignedActivity> assignedTo =
> new
> >> HashSet<AssignedActivity>();
> >>    
> >> ...}
> >> 
> >> As the id from the parent class (Activity) is
> generated by
> >> a sequence from
> >> the database, when I'm trying to insert a new
> Activity,
> >> the record for
> >> parent object is correct (the id is generated) but
> not for
> >> the child
> >> (AssignedActivity). So i've the child inserted
> but
> >> width the pact_id = null. 
> >> 
> >> Have you got any idea of which is the problem??
> >> Thanks !
> >> 
> >> 
> >> 
> >> Fay Wang wrote:
> >> > 
> >> > Hmmm. Here is my test case and it works fine.
> Four
> >> classes are listed:
> >> > (1) TblPdtbnf0.java
> >> > (2) TblPdtbnfId.java
> >> > (3) TblScmpdt0.java
> >> > (4) Test0.java
> >> > 
> >> > You might still want to try it? :=))
> >> > 
> >> > -f
> >> > 
> >> >
> ====================================================
> >> > (1) TblPdtbnf0.java 
> >> > 
> >> > package insert;
> >> > 
> >> > import javax.persistence.CascadeType;
> >> > import javax.persistence.Column;
> >> > import javax.persistence.Entity;
> >> > import javax.persistence.FetchType;
> >> > import javax.persistence.Id;
> >> > import javax.persistence.IdClass;
> >> > import javax.persistence.JoinColumn;
> >> > import javax.persistence.ManyToOne;
> >> > 
> >> > @Entity
> >> > @IdClass(TblPdtbnfId.class)
> >> > public class TblPdtbnf0 {
> >> >     @Id
> >> >     @Column(name = "PDTBNF_ID",
> nullable =
> >> false)
> >> >     private Integer pdtbnfId; 
> >> > 
> >> >     @Id
> >> >     @Column(name = "SCMPDT_ID",
> nullable =
> >> false)
> >> >     private Integer scmpdtId; 
> >> > 
> >> >     @ManyToOne(fetch = FetchType.LAZY,
> cascade =
> >> CascadeType.MERGE)
> >> >     @JoinColumn(name = "XYZ_ID",
> >> referencedColumnName = "SCMPDT_ID")
> >> >     private TblScmpdt0 tblScmpdt;
> >> >     
> >> >     public Integer getPdtbnfId() {
> >> >         return pdtbnfId;
> >> >     }
> >> > 
> >> >     public void setPdtbnfId(Integer pdtbnfId)
> {
> >> >         this.pdtbnfId = pdtbnfId;
> >> >     }
> >> > 
> >> >     public Integer getScmpdtId() {
> >> >         return scmpdtId;
> >> >     }
> >> > 
> >> >     public TblScmpdt0 getTblScmpdt() {
> >> >         return tblScmpdt;
> >> >     }
> >> > 
> >> >     public void setTblScmpdt(TblScmpdt0
> tblScmpdt) {
> >> >         this.tblScmpdt = tblScmpdt;
> >> >         this.scmpdtId =
> tblScmpdt.getScmpdtId();
> >> >     }
> >> > }
> >> >
> >>
> =============================================================
> >> > (2)TblPdtbnfId.java
> >> > 
> >> > package insert;
> >> > 
> >> > import java.io.Serializable;
> >> > 
> >> > public class TblPdtbnfId implements
> Serializable{
> >> >     private Integer pdtbnfId;    
> >> >     private Integer scmpdtId; 
> >> > 
> >> >     public TblPdtbnfId(){}
> >> >     public TblPdtbnfId(Integer pdtbnfId,
> Integer
> >> scmpdtId) {
> >> >         this.pdtbnfId = pdtbnfId;
> >> >         this.scmpdtId = scmpdtId;
> >> >     }
> >> >     
> >> >     public Integer getScmpdtId() {
> >> >         return scmpdtId;
> >> >     }
> >> > 
> >> >     public Integer getPdtbnfId() {
> >> >         return pdtbnfId;
> >> >     }
> >> >     
> >> >     public boolean equals(Object o) {
> >> >        return (o instanceof TblPdtbnfId)
> &&
> >> >        pdtbnfId.intValue() ==
> >> ((TblPdtbnfId)o).getPdtbnfId().intValue()
> &&
> >> >        scmpdtId.intValue() ==
> >> ((TblPdtbnfId)o).getScmpdtId().intValue();
> >> >     }
> >> >     
> >> >     public int hashCode() {
> >> >         int hc = 0;
> >> >         if (pdtbnfId != null) hc = hc +
> >> pdtbnfId.hashCode();
> >> >         if (scmpdtId != null) hc = hc +
> >> scmpdtId.hashCode();
> >> >         return hc;
> >> >     }
> >> > }
> >> > 
> >> >
> ==============================================
> >> > (3)TblScmpdt0.java  
> >> > 
> >> > package insert;
> >> > import java.util.ArrayList;
> >> > import java.util.Collection;
> >> > 
> >> > import javax.persistence.CascadeType;
> >> > import javax.persistence.Column;
> >> > import javax.persistence.Entity;
> >> > import javax.persistence.FetchType;
> >> > import javax.persistence.GeneratedValue;
> >> > import javax.persistence.GenerationType;
> >> > import javax.persistence.Id;
> >> > import javax.persistence.JoinColumn;
> >> > import javax.persistence.JoinColumns;
> >> > import javax.persistence.OneToMany;
> >> > import javax.persistence.OneToOne;
> >> > import javax.persistence.TableGenerator;
> >> > 
> >> > @Entity
> >> > public class TblScmpdt0  {
> >> >    
> >> >
> >>
> @TableGenerator(name="baseGenerator",schema="EBSTATUS",table="TBL_KEYGEN",
> >> >                
> >> pkColumnName="PRIMARY_KEY_COLUMN",
> >> >                
> >> valueColumnName="LAST_USED_ID",
> >> >                
> >>
> pkColumnValue="TBL_SCMPDT_ID",allocationSize=100)
> >> > @Id
> >> >
> >>
> @GeneratedValue(strategy=GenerationType.TABLE,generator="baseGenerator")
> >> > @Column(name =
> "SCMPDT_ID",nullable=false)
> >> > private Integer scmpdtId;
> >> >     
> >> > @OneToMany(fetch = FetchType.LAZY,
> >> >            mappedBy="tblScmpdt",
> >> >           
> >> cascade={CascadeType.MERGE,CascadeType.REMOVE,
> >> >                     CascadeType.PERSIST})
> >> > private Collection<TblPdtbnf0>
> tblPdtbnfs = new
> >> ArrayList<TblPdtbnf0>();
> >> >     
> >> >     private String admsysCde;
> >> >     private String fndCde;
> >> >     private String gccCde;
> >> >     
> >> >  public Collection getTblPdtbnfs() {
> >> >          return tblPdtbnfs;
> >> >  }
> >> >  
> >> >  public void setTblPdtbnfs(Collection
> tblPdtbnfs) {
> >> >          this.tblPdtbnfs = tblPdtbnfs;
> >> >  }
> >> >  
> >> >  public void addTblPdtbnf(TblPdtbnf0
> tblPdtbnf) {
> >> >      tblPdtbnfs.add(tblPdtbnf);
> >> >  }
> >> >  
> >> >  public Integer getScmpdtId() {
> >> >      return scmpdtId;
> >> >  }
> >> >  
> >> >         public String getAdmsysCde() {
> >> >             return admsysCde; 
> >> >         }
> >> >  
> >> >  public void setAdmsysCde(String admsysCde) {
> >> >      this.admsysCde = admsysCde; 
> >> >  }
> >> >  
> >> >  public void setFndCde(String fndCde) {
> >> >      this.fndCde = fndCde;
> >> >  }
> >> >  
> >> >  public String getFndCde(){
> >> >      return fndCde;
> >> >  }
> >> >  
> >> >  public void setGccCde(String gccCde){
> >> >      this.gccCde = gccCde;
> >> >  }
> >> >  
> >> >  public String getGccCde() {
> >> >      return gccCde;
> >> >  }
> >> > }
> >> > 
> >> >
> >>
> ========================================================
> >> > (4) Test0.java:
> >> > package insert;
> >> > 
> >> > import javax.persistence.EntityManager;
> >> > import
> javax.persistence.EntityManagerFactory;
> >> > import javax.persistence.Persistence;
> >> > 
> >> > public class Test0 {
> >> > 
> >> >   public static void main(String[] args) {
> >> >     try{
> >> >  EntityManagerFactory emf = 
> >> >            
> >>
> Persistence.createEntityManagerFactory("insert");
> >> >  EntityManager em =
> emf.createEntityManager();
> >> >          
> >> >  em.getTransaction().begin();
> >> >         
> >> >         TblScmpdt0 tblScmpdt = new
> TblScmpdt0();
> >> >        
> tblScmpdt.setAdmsysCde("EBSTA");
> >> >        
> tblScmpdt.setFndCde("1526");
> >> >        
> tblScmpdt.setGccCde("A1526");
> >> >        
> >> >         TblPdtbnf0 tblPdtbnf = new
> TblPdtbnf0();
> >> >         tblPdtbnf.setTblScmpdt(tblScmpdt);
> >> >        
> >> >         tblScmpdt.addTblPdtbnf(tblPdtbnf);
> >> >         tblScmpdt = em.merge(tblScmpdt);
> >> >         em.getTransaction().commit();
> >> >  
> >> >     } catch (Exception e){
> >> >         e.printStackTrace();
> >> >     }
> >> >   }
> >> > }
> >> > 
> >> > --- On Tue, 6/17/08, Enrico Goosen
> >> <[EMAIL PROTECTED]> wrote:
> >> > 
> >> >> From: Enrico Goosen
> >> <[EMAIL PROTECTED]>
> >> >> Subject: Re: @OneToMany/@ManyToOne,
> Bidirectional,
> >> Composite Key
> >> >> To: users@openjpa.apache.org
> >> >> Date: Tuesday, June 17, 2008, 1:32 AM
> >> >> Hi Fay,
> >> >> 
> >> >> I tried out your suggestion:
> >> >> @ManyToOne(fetch =
> >> >> FetchType.LAZY,cascade=CascadeType.MERGE)
> >> >> @JoinColumn(name =
> >> >>
> >>
> "XYZ_ID",referencedColumnName="SCMPDT_ID")
> >> >> 
> >> >> private TblScmpdt tblScmpdt;
> >> >> 
> >> >> But unfortunately, still no luck.
> >> >> Got this exception:
> >> >> <openjpa-1.1.0-r422266:657916 fatal
> store
> >> error>
> >> >>
> org.apache.openjpa.persistence.RollbackException:
> >> DB2 SQL
> >> >> error: SQLCODE:
> >> >> -407, SQLSTATE: 23502, SQLERRMC:
> TBSPACEID=2,
> >> TABLEID=263,
> >> >> COLNO=0
> >> >>         at
> >> >>
> >>
> org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:523)
> >> >>         at
> >> test.za.co.metcapri.Tester.test(Tester.java:100)
> >> >>         at
> >> test.za.co.metcapri.Tester.main(Tester.java:21)
> >> >> Caused by:
> <openjpa-1.1.0-r422266:657916
> >> nonfatal
> >> >> general error>
> >> >>
> >>
> org.apache.openjpa.persistence.PersistenceException: DB2
> >> >> SQL error: SQLCODE:
> >> >> -407, SQLSTATE: 23502, SQLERRMC:
> TBSPACEID=2,
> >> TABLEID=263,
> >> >> COLNO=0
> >> >> FailedObject: prepstmnt 14779369 INSERT
> INTO
> >> >> EBSTATUS.TBL_PDTBNF (PDTBNF_ID,
> >> >> SCMPDT_ID, CMN_DTE) VALUES (?, ?, ?)
> >> >>
> >>
> [org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement]
> >> >> 
> >> >> SQLSTATE 23502: An insert or update value
> is null,
> >> but the
> >> >> column cannot
> >> >> contain null values.
> >> >> 
> >> >> The closest I came to solving this
> problem was a
> >> suggestion
> >> >> I saw in the
> >> >> Hibernate forums, where a user was
> experiencing
> >> the same
> >> >> problem.
> >> >>
> >>
> http://forum.hibernate.org/viewtopic.php?t=987126&highlight=detached&sid=48c7ceada0b8df5718275a74d6dcafc4
> >> >>
> >>
> http://forum.hibernate.org/viewtopic.php?t=987126&highlight=detached&sid=48c7ceada0b8df5718275a74d6dcafc4
> >> >> 
> >> >> 
> >> >> I changed TblPdtbnf.class to use an
> @EmbeddedId:
> >> >> 
> >> >> @EmbeddedId
> >> >> private TblPdtbnfPK tblPdtbnfPK;
> >> >> 
> >> >> Changed TblPdtbnfPK to @Embeddable.
> >> >> 
> >> >> I also had to modify the setters on
> TblPdtbnf like
> >> so:
> >> >> 
> >> >> public void setTblScmpdt(TblScmpdt
> tblScmpdt) {
> >> >>         this.tblScmpdt = tblScmpdt;
> >> >>         if(this.tblPdtbnfPK == null){
> >> >>                 this.tblPdtbnfPK = new TblPdtbnfPK();
> >> >>         }
> >> >>         if(tblScmpdt != null){
> >> >>
> >>
>               this.tblPdtbnfPK.setScmpdtId(tblScmpdt.getScmpdtId());
> >> >>         }
> >> >> }
> >> >> public void setTblPdtbnfcde(TblPdtbnfcde
> >> tblPdtbnfcde) {
> >> >>         this.tblPdtbnfcde = tblPdtbnfcde;
> >> >>         if(this.tblPdtbnfPK == null){
> >> >>                 this.tblPdtbnfPK = new TblPdtbnfPK();
> >> >>         }
> >> >>         if(tblPdtbnfcde != null){
> >> >>
> >>
>               this.tblPdtbnfPK.setPdtbnfId(tblPdtbnfcde.getPdtbnfId());
> >> >>         }
> >> >> }
> >> >> 
> >> >> I was able to perform a cascading
> persist, but
> >> when I
> >> >> checked the database,
> >> >> there were two new columns on TBL_PDTBNF,
> viz.
> >> scmpdtId,
> >> >> and pdtbnfId, in
> >> >> addition to the existing columns
> SCMPDT_ID and
> >> PDTBNF_ID.
> >> >> I tried renaming the fields on
> TblPdtbnfPK.class
> >> to match
> >> >> the database
> >> >> columns, to prevent this problem, but
> that
> >> didn't help.
> >> >> 
> >> >> As a last resort, I tried switching JPA
> providers
> >> to
> >> >> Hibernate, and I found
> >> >> that the problem exists in Hibernate as
> well.
> >> >> 
> >> >> I give up...:-((
> >> >> -- 
> >> >> View this message in context:
> >> >>
> >>
> http://www.nabble.com/%40OneToMany-%40ManyToOne%2C-Bidirectional%2C-Composite-Key-BUG-tp17801245p17880499.html
> >> >> Sent from the OpenJPA Users mailing list
> archive
> >> at
> >> >> Nabble.com.
> >> > 
> >> > 
> >> >       
> >> > 
> >> > 
> >> 
> >> -- 
> >> View this message in context:
> >>
> http://n2.nabble.com/%40OneToMany-%40ManyToOne%2C-Bidirectional%2C-Composite-Key-BUG-tp210672p1515826.html
> >> Sent from the OpenJPA Users mailing list archive
> at
> >> Nabble.com.
> > 
> > 
> >       
> > 
> > 
> 
> -- 
> View this message in context:
> http://n2.nabble.com/%40OneToMany-%40ManyToOne%2C-Bidirectional%2C-Composite-Key-BUG-tp210672p1519911.html
> Sent from the OpenJPA Users mailing list archive at
> Nabble.com.


      

Reply via email to