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.


      

Reply via email to