Heath Thomann created OPENJPA-2651:
--------------------------------------
Summary: IDs of entities are incorrectly assigned when
@SqlResultSetMapping is used with inheritance and a ManyToOne relationship.
Key: OPENJPA-2651
URL: https://issues.apache.org/jira/browse/OPENJPA-2651
Project: OpenJPA
Issue Type: Bug
Components: sql
Affects Versions: 2.2.3, 2.4.2
Reporter: Heath Thomann
Assignee: Heath Thomann
Priority: Critical
I have discovered an issue with using @SqlResultSetMapping when inheritance and
ManyToOne relationships are used. To explain the issue, take this entity and
@SqlResultSetMapping:
@Entity
@SqlResultSetMapping(name = "MyResMap", entities = { @EntityResult(entityClass
= CrtRequisicaoChequePersEntity.class, fields = {
@FieldResult(name = "crtOperacaoByOperacaoRecepcaoServCent.id", column =
"opRecepcaoServCentraisId"),
@FieldResult(name = "crtOperacaoByOperacaoRecepcaoServCent.dataHora",
column = "opRecepcaoServCentraisDataHora")
})
})
public class CrtRequisicaoChequePersEntity extends CrtRequisicaoEntity {
.......
@ManyToOne
@javax.persistence.JoinColumn(name = "OPERACAO_RECEPCAO_SERV_CENT",
referencedColumnName = "ID")
private CrtOperacaoEntity crtOperacaoByOperacaoRecepcaoServCent;
As you can see, this entity extends 'CrtRequisicaoEntity' and has a ManyToOne
relationship to 'CrtOperacaoEntity', with name
'crtOperacaoByOperacaoRecepcaoServCent'. As you can see, the @FieldResult in
the @SqlResultSetMapping references the fields in 'CrtOperacaoEntity'. These
two entities are defined as follows:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class CrtRequisicaoEntity {
.....
@Id
private long id;
.....
@Entity
public class CrtOperacaoEntity implements Serializable {
.....
@Id
private long id;
@Basic
private Timestamp dataHora;
With these entities, take an SQL select which uses an AS (the entire SQL is to
long to add here, see provided recreate/test attached):
String sqlCust = "SELECT t0.ID" +
.........
",t2.DATA_HORA as opRecepcaoServCentraisDataHora" +
",t2.ID as opRecepcaoServCentraisId" +
....
"FROM CrtRequisicaoChequePersEntity t0"
....
"INNER JOIN CrtOperacaoEntity t2"
....
With this SQL, the two IDs will be populated with the ID from
CrtRequisicaoChequePersEntity, rather than the ID corresponding to each entity.
Thanks,
Heath
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)