Hibernate Annotations - InheritanceType com @OneToOne compartilhando a mesma pk

2 respostas
D
seguinte galera tenho o seguinte codigo:
@Entity
@Table(name = "person")
@Inheritance(strategy = InheritanceType.JOINED)
public class Person {
	
	@Id
	@GeneratedValue
	private Long id;
}

@Entity
@Table(name = "service_provider")
public class ServiceProvider extends Person {
	
	@OneToOne(cascade = CascadeType.ALL)
	@PrimaryKeyJoinColumn(name = "id")
	private Person person;
}

@Entity
@Table(name = "corporation")
public class Corporation extends ServiceProvider {
	
	@OneToOne(cascade = CascadeType.ALL)
	@PrimaryKeyJoinColumn(name="person_id")
	private ServiceProvider serviceProvider;
}
No meu dao faço o seguinte:
IDao<Corporation> dao = new Dao<Corporation>();

Corporation c = new Corporation();

c.setName("GUJ");
// continua

dao.save(c);

Acontece que pelo que eu entendi, o hibernate deveria inserir Person depois ServiceProvider e em seguinda Corporation
mais isso não esta acontecendo, acontece o seguinte erro;

java.sql.SQLException: Field 'person_id' doesn't have a default value

Nesse caso, todas as minhas três classes compartilham a mesma pk, sendo que a tabela service_provider a pk e fk são as mesma, referenciando a tabela person, e a tabela corporation tem pk e fk de service_provider.
Resumindo, as três tabelas a pk é a a coluna id da tabela person.

Alguém pode me dar uma luz?

2 Respostas

davidbuzatto

Vc precisa mesmo usar @PrimaryKeyJoinColumn?
Qual o problema em deixar o hibernate decidir por vc?
Precisa existir uma tabela service_provider? Se não, use a anotação @MappedSuperClass em ServiceProvider (e tire @Entity).

D

No caso eu preciso da tabela service_provider, na verdade eu não queria fazer os joins na hora de buscar esses dados, já que é um relacionamento OneToOne entre todas as tabelas, onde person É UM corporation e corporation É UM service_provider.

Criado 1 de novembro de 2009
Ultima resposta 1 de nov. de 2009
Respostas 2
Participantes 2