Hello all,

To demonstrate the problem and make it easier to get help, I have created
an application here:

https://github.com/malakeel/jpa-id-class-example


This application is to create tables with constrains from JPA entities.
Tables are created, however I am unable to generate
the foreign key constrains.

Here's the description of the entities. We have the Services Entity, with
fields relates the service provider to the
client, and the service type. The Service Entity has its primary keys
(service provider and client). Both are Person(s).

When this application is run using @IdClass(ServicePK.class), I get the
exception:

<openjpa-2.3.0-r422266:1540826 fatal user error>
org.apache.openjpa.persistence.ArgumentException: The id class specified by
type "class com.example.Service" does not match the primary key fields of
the class.  Make sure your identity class has the same primary keys as your
persistent type, including pk field types. Mismatched property: "client"
    at
org.apache.openjpa.meta.ClassMetaData.validateAppIdClassPKs(ClassMetaData.java:2225)
    at
org.apache.openjpa.meta.ClassMetaData.validateAppIdClass(ClassMetaData.java:2099)
    at
org.apache.openjpa.meta.ClassMetaData.validateIdentity(ClassMetaData.java:2035)
    at
org.apache.openjpa.meta.ClassMetaData.validateMeta(ClassMetaData.java:1947)
    at
org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1808)

Please note that the Composite Key has objects as keys.

For convenience I created another @IdClass called (ServicePK_Simple.java).
We can change the @IdClass(ServicePK.class) to
@IdClass(ServicePK_Simple.class).

This class has the fields as Strings. If we use this class as the PK for
service, then the tables are generated but without FK constrains.
For example on postgresql, this is the "create table sql" statement:

CREATE TABLE service
(
  client_id character varying(255) NOT NULL,
  ser_provider_id character varying(255) NOT NULL,
  type_id character varying(255),
  CONSTRAINT service_pkey PRIMARY KEY (client_id, ser_provider_id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE service
  OWNER TO postgres;

CREATE INDEX i_service_type
  ON service
  USING btree
  (type_id COLLATE pg_catalog."default");


I have tested it with hibernate as well, to make sure I am not missing
something. To see the test results with hibernate, please change the
<provider> class in persistence.xml. Hibernate is generating the table with
correct constraints:


CREATE TABLE service
(
  ser_provider_id character varying(255) NOT NULL,
  client_id character varying(255) NOT NULL,
  type_id character varying(255),
  CONSTRAINT service_pkey PRIMARY KEY (client_id, ser_provider_id),
  CONSTRAINT fkd97c5e956f35ba95 FOREIGN KEY (client_id)
      REFERENCES person (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkd97c5e95b83f253e FOREIGN KEY (type_id)
      REFERENCES servicetype (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkd97c5e95e71b3950 FOREIGN KEY (ser_provider_id)
      REFERENCES person (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE service
  OWNER TO postgres;


What do I need to do to get this to work with OpenJPA ?

Thank you.

Reply via email to