fazendo uns testes a força bruta, resgistrando tentativa falha, ele gerou o seguinte jpql
[quote]Hibernate: insert into owners (logo_id, name) values (?, ?)
Hibernate: select currval(‘owners_owner_id_seq’)
Hibernate: insert into info_requesters (final_date, owner_id) values (?, ?)
Hibernate: select currval(‘info_requesters_info_request_id_seq’)
Hibernate: select nextval (‘integer_fields_integer_field_id_seq’)
Hibernate: insert into integer_fields (label, required, info_request_id, integer_field_id) values (?, ?, ?, ?)
Hibernate: update FieldDefinition set info_request_id=? where integer_field_id=?[/quote]
reparem que na última linha ele gerou uma operação de update para classe abstrata onde não deveria, apesar de na linha anterior ter feito um insert na tabela correta mapeada a partir da subclasse. segue como ficou mapeamento para gerar comportamento acima:
classe abstrata FieldDefinition … Fiz propositalmente declaração dos campos na superclasse, pois não consegui rescrevê-los na subclasse demonstrado no 1º post deste tópico
[code]@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class FieldDefinition extends BaseEntity {
private static final long serialVersionUID = 8428299722798237491L;
…
// sei que este mapeamento abaixo está errado na superclasse, mas não consegui específicá-los na subclasse, então fiz teste de força bruta que não deu certo
@Id @Column(name=“integer_field_id”)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=“generator”)
@SequenceGenerator(name=“generator”, sequenceName=“integer_fields_integer_field_id_seq”)
protected Integer id;
}[/code]
subclasse IntegerField
@Entity
@Table(name="integer_fields")
public class IntegerField extends FieldDefinition {
...
}
classe InfoRequest que possui relacionamento OneToMany com classe abstrata FieldDefinition, do tipo Set
@Entity
@Table(name="info_requesters")
public class InfoRequest extends BaseEntity {
...
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="info_request_id")
private Set<FieldDefinition> fieldDefinition;
}
segue abaixo como ficou chamada para metodo de teste do log acima identificado na geração do hql
[code]@Test public void testBasic() {
InfoRequest infoRequest = createInfoRequest(); // cria instancia apenas da entidade infoRequest
IntegerField fieldAge = new IntegerField(); // criando item
fieldAge.setLabel("age");
fieldAge.setRequired(true);
fieldAge.setInfoRequest( infoRequest );
infoRequest.add( fieldAge ); // adicionando item ao infoRequest
infoRequestRepository.create( infoRequest ); // criando,
sync(); // aqui faz em.flush() e em.clear() ... e ele dá erro na chamada flush() no comentário abaixo
assertTrue( true );
}[/code]
erro ocorre após executar linha de método acima sync()
[quote]Caused by: java.sql.BatchUpdateException: Entrada em lote 0 update FieldDefinition set info_request_id=107 where integer_field_id=1700 foi abortada. Chame getNextException para ver a causa. ERRO: relação “fielddefinition” não existe
[/quote]
obs: último acima informa uma coisa óbvia, faltando apenas fazer com que ele gere jpql para entidade certa. :?: