Problema com Herança

Opa galera tudo bom?

então, até agora não tive problemas com JPA
porém sempre tem a primeira vez certo? o problema é a persistencia de subclasses,

bom vamos as classes
Super:

[code]@Entity
@Table(name=“people”)
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name=“dtype”,discriminatorType = DiscriminatorType.CHAR)
@DiscriminatorValue(value=“P”)
public class People implements Persistent, Serializable {

@Id
@SequenceGenerator(name = "people_id", sequenceName = "people_seq",
allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "people_id")
protected Long id;
//gets, sets omitidos

}
[/code]

e as duas subclasses

[code]
@Entity
@DiscriminatorValue(value=“C”)
@PrimaryKeyJoinColumn(name=“id”)
@Table(name=“company”)
public class Company extends People{
//gets, sets omitidos
}

@Entity
@DiscriminatorValue(value = “U”)
@PrimaryKeyJoinColumn(name = “id”)
@Table(name = “system_user”)
public class SystemUser extends People{
//gets, sets omitidos
}[/code]

e a exception ao rodar o teste unitário:

Internal Exception: Exception [EclipseLink-7161] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException Exception Description: Entity class [class com.domain.Company] has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass. If you have defined PK using any of these annotations then make sure that you do not have mixed access-type (both fields and properties annotated) in your entity class hierarchy. at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126) at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:115) at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) at com.domain.util.UtilDao.<clinit>(UtilDao.java:31) at org.domain.test.AbstractTest.<clinit>(AbstractTest.java:29) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:187) at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:236) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:233) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68) Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.EntityManagerSetupException Exception Description: Predeployment of PersistenceUnit [pu_test] failed. Internal Exception: Exception [EclipseLink-7161] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException Exception Description: Entity class [class com.domain.Company] has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass. If you have defined PK using any of these annotations then make sure that you do not have mixed access-type (both fields and properties annotated) in your entity class hierarchy. at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1385) at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:98) at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:105) ... 32 more

bom, o meu objetivo é manter a tabela “people” com atributos básicos dela como id, name,
porém se eu uso @MappedSuperclass o problema com o id das subclasses não ocorre, mas são geradas apenas duas tabelas (system_user,company), com os atributos da superclasse gravados nessas tabelas, o que não é meu objetivo.

ja tentei de diversas formas, uma que chegou bem perto do objetivo foi sobrescrever o método getId() nas subclasses e anotar com @Id no método, porém ao gravar sempre estava nulo, pois a superclasse não havia sido persistida.

Alguém sabe me dizer o que eu deixei passar?

Tente com @MappedSuperclass e troque o @Inheritance(strategy = InheritanceType.JOINED)
por
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Funcionou da mesma forma que antes, criando apenas as duas tabelas( system_user e company )

Você quer criar a tabela de people também?
Então esquece o @MappedSuperclass
Essa annotation indica que esta entidade não será mapeada.
Vamos analisar. Você encheu de coisas ali que não precisa, principalmente se for trabalhar com 3 tabelas (seriam úteis caso agrupasse tudo na tabela people, aí o discriminator funcionaria bem).

Obrigado drsmachado pela ajuda,

A idéia é essa, ter a tabela people, com atributos comuns às duas classes.

Camarada, não posso testar agora, mas deixando apenas as anotações de entidade e tabela deveria funcionar, além, claro, de indicar que é uma relação de herança.
Acho que resolve

Obrigado, novamente, pela força

tentei da forma enxuta sugerida, mas sem sucesso, o EclipseLink continua cobrando @Id nas subclasses.
vou experimentar com o Hibernate, teoricamente deve funcionar da mesma forma,mas quem sabe consigo uma luz.
Não queria usar composição, mas não encontrar outra alternativa…

Uma ideia que tive foi passar a classe People para interface e usar uma sequence comum entre Company e SystemUser,
mas só em último caso vou recorrer a isso.

Vou ver o que consigo com o Hibernate, e posto os resultados.

Obrigado.

Bom,
antes de ir ao Hibernate, tentei o seguinte em um projeto separado apenas com as três classes e remontei o problema,
da forma mais simples possível, e a montagem das tabelas ocorreu da forma que eu queria,
de forma lógica cheguei a conclusão de que o problema não está no @Id cobrado pelo eclipse link, ainda não descobri o que é
mas de alguma forma outro mapeamento está interferindo em minhas classes, vou remover os campos um a um até descobrir qual é
e finalmente prosseguir o desenvolvimento.

mas enfim, abaixo o exemplo com o qual consegui reproduzir com sucesso,
Obrigado pela ajuda.

[code]@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class People {

@Id
@GeneratedValue(generator="people_pk",strategy= GenerationType.SEQUENCE)
@SequenceGenerator(name = "people_pk", sequenceName = "people_seq",
allocationSize = 1)
protected Long id;
protected String name;

//ggas

}

@Entity
@DiscriminatorValue(value=“C”)
public class CompanyUser extends People{
private String cnpj;

//ggas

}

@Entity
@DiscriminatorValue(value=“U”)
public class CustomerUser extends People{
private String cpf;
private String rg;
//ggas
}[/code]

Encontrei o problema, no projeto original ao usar @MappedSuperClass
a classe People foi retirada do Mapeamento no persistence.xml, não estando mapeada.
Mas vendo do lado do erro repassado pelo Eclipse Link, acredito que ele deveria avisar que a Classe a qual estava fazendo herança, não era conhecida, erro comum ao usar @Entity e não adicioná-la ao persistence.xml,
Enfim, o importante é que encontrei o problema, obrigado pela ajuda.