You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Francesco Chicchiriccò (JIRA)" <ji...@apache.org> on 2016/08/09 08:56:20 UTC

[jira] [Commented] (OPENJPA-2651) IDs of entities are incorrectly assigned when @SqlResultSetMapping is used with inheritance and a ManyToOne relationship.

    [ https://issues.apache.org/jira/browse/OPENJPA-2651?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15413228#comment-15413228 ] 

Francesco Chicchiriccò commented on OPENJPA-2651:
-------------------------------------------------

LGTM: are you keen to provide a test case too?

> 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
>         Attachments: OPENJPA-2651-2.2.x.patch, SqlResultSetMappingIssue.zip
>
>
> 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)