[jboss-user] [EJB 3.0] - CascadeType.PERSIST question

ttrepper do-not-reply at jboss.com
Sat Sep 8 05:50:30 EDT 2007


Hi all, 

I am running into troubles with the cascdetype, Please imagine the following szenario:

SQL (tables)

  | CREATE TABLE Party (
  |     PartyID BIGINT DEFAULT nextval('seq_PartyID')  NOT NULL,
  |     CONSTRAINT PK_Party PRIMARY KEY (PartyID)
  | );
  | 
  | CREATE TABLE PartyIsPerson (
  |     PartyIDPerson BIGINT  NOT NULL,
  |     Forename CHARACTER VARYING(80)  NOT NULL,
  |     Lastname CHARACTER VARYING(80)  NOT NULL,
  |     CONSTRAINT PK_PartyIsPerson PRIMARY KEY (PartyIDPerson)
  | );
  | 
  | CREATE TABLE PersonHasCustomization (
  |     PartyIDPerson BIGINT  NOT NULL,
  |     Locale CHARACTER VARYING(5),
  |     CONSTRAINT PK_PersonHasCustomization PRIMARY KEY (PartyIDPerson)
  | );

The Party-class ist declared with @Inheritance(strategy=InheritanceType.JOINED)

and the PartyIsPerson extends from it.



  | package com.auctonova.ejb.persistence;
  | 
  | import java.io.Serializable;
  | import java.sql.Date;
  | 
  | import javax.persistence.Entity;
  | import javax.persistence.OneToOne;
  | import javax.persistence.PrimaryKeyJoinColumn;
  | import javax.persistence.CascadeType;
  | 
  | @Entity
  | @PrimaryKeyJoinColumn(name="partyidperson", referencedColumnName="partyid")
  | public class PartyIsPerson extends Party implements Serializable {
  | 	private static final long serialVersionUID = 1L;
  | 	private String forename;
  | 	private String lastname;
  | 	private PersonHasCustomization customization;
  | 
  | 	//--------------------------------------------------------------------------
  | 	public String getForename() {
  | 		return this.forename;
  | 	}
  | 
  | 	//--------------------------------------------------------------------------
  | 	public void setForename(String forename) {
  | 		this.forename = forename;
  | 	}
  | 
  | 	//--------------------------------------------------------------------------
  | 	public String getLastname() {
  | 		return this.lastname;
  | 	}
  | 
  | 	//--------------------------------------------------------------------------
  | 	public void setLastname(String lastname) {
  | 		this.lastname = lastname;
  | 	}
  | 
  | 	//--------------------------------------------------------------------------
  | 	@OneToOne(cascade=CascadeType.PERSIST)
  | 	@PrimaryKeyJoinColumn(name="partyidperson", referencedColumnName="partyidperson")
  | 	public PersonHasCustomization getCustomization() {
  | 		return this.customization;
  | 	}
  | 
  | 	//--------------------------------------------------------------------------
  | 	public void setCustomization(PersonHasCustomization customization) {
  | 		this.customization = customization;
  | 	}
  | }
  | 

When I am now trying to execute the following code in a bean

  | PartyIsPerson p = new PartyIsPerson();
  | p.setUsername("Guest");		//Guest
  | p.setPassword("Guest");		//Guest
  | p.setForename("Guest");		//Guest
  | p.setLastname("Guest");		//Guest
  | p.setPartyId(100);
  | 
  | PersonHasCustomization phc = new PersonHasCustomization();
  | phc.setLocale("DE_de");
  | p.setCustomization(phc);
  | 
  | EntityManager.persist(p)

than I get the following error:

  | 11:19:28,953 ERROR [JDBCExceptionReporter] Batch-Eintrag 0 insert into PersonHasCustomization (locale, pm_forward_to, partyidperson) values (DE_de, NULL, 0) wurde abgebrochen.  Rufen Sie 'getNextException' auf, um die Ursache zu erfahren.
  | 11:19:28,953 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: 23503
  | 11:19:28,953 ERROR [JDBCExceptionReporter] ERROR: insert or update on table "personhascustomization" violates foreign key constraint "partyisperson_personhascustomization"
  |   Detail: Key (partyidperson)=(0) is not present in table "partyisperson".
  | 11:19:28,953 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session

In my opinion this part of the exception
Detail: Key (partyidperson)=(0) is not present in table "partyisperson"
means, that something is wrong with the Primary-keys, of course there is no person with the id=0, but i want the EntityManager automatically to assign the customisation the SAME id (in this case 100), before inserting both.

Does anybody has an idea, what i am doing wrong?

Thank you very much for help and kind regards,

Thomas

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4082332#4082332

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4082332



More information about the jboss-user mailing list