-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: SINGLE TABLE - EAGER FECTH - DISCRINATOR - WHERE / JOIN
PostPosted: Tue Aug 25, 2015 2:38 am 
Newbie

Joined: Fri Dec 17, 2010 10:53 am
Posts: 8
JPA/Hibernate does not add the where clause or make the join on the discriminator for EAGER fetch on SINGLE_TABLE inheritance. When we use the API em.find(class, key), it retrieves more than one instance (More than one row with the given identifier was found: 1).

Hibernate 4.2.18 under JPA 2.0, JBOSS A7. Single table inheritance pattern.

DATA_REF_CODE2_TB is a list of code.
Code:
DREFSUJID   NUMBER(7,0)   No   (this is the foreign key used as discriminator)
DREFCODCLE   VARCHAR2(6 BYTE)   No
DREFCODDESC   VARCHAR2(256 BYTE)   No


DATA_REF_SUJET_TB is a list of topic.
Code:
DREFSUJID            NUMBER(7,0)
DREFSUJDESC   VARCHAR2(128 BYTE)


Code:
@Entity
@Table(name = "DATA_REF_CODE2_TB")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DREFSUJID", discriminatorType = DiscriminatorType.INTEGER)
public abstract class DataReferenceCode implements ICodeEntity<String> {

    private static final long serialVersionUID = 1L;

    @NotNull
    @Size(min = 1, max = 6)
    @Column(name = "DREFCODCLE", unique = true, nullable = false, length = 6, columnDefinition = "varchar2(6)")
    @Id
    private String code;

    @NotNull
    @Digits(integer = 7, fraction = 0)
    @Column(name = "DREFSUJID", insertable = false, updatable = false, nullable = false, precision = 7, columnDefinition = "number(7,0)")
    private long sujet;

    @NotNull
    @Size(min = 1, max = 256)
    @Column(name = "DREFCODDESC", nullable = false, length = 256, columnDefinition = "varchar2(256)")
    private String description;


Code:
@Entity
@DiscriminatorValue("111")
public class CodeRegroupement extends DataReferenceCode {

    private static final long serialVersionUID = 1L;

    // we have nothing here
    }



Code:
public interface ICodeEntity<PK extends Serializable> extends IEntity<PK>, ICode<PK> {

}



Code:
public interface ICode<T extends Serializable> extends Serializable {

    T getCode();
    void setCode(T code);
    String getDescription();
    void setDescription(String description);
}



Code:
public interface IEntity<PK extends Serializable> extends Serializable {

// we have nothing here
}



Then we have an entity CodeStatutCanada that it contains an attribute CodeRegroupement codeRegroupement.

Code:
@Entity
@Table(name = "PLSTATUT_CANADA")
public class CodeStatutCanada  implements ICodeEntity<String> {

    private static final long serialVersionUID = 1L;

    @Id
    @NotNull
    @Size(min = 1, max = 1)
    @Column(name = "STCCOD", unique = true, length = 1, nullable = false, columnDefinition = "char(1)")
    private String code;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "STCCODNOUV")
    private CodeStatutGdeu codeStatutGdeu;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "STCCODRGRSTACAN")
    private CodeRegroupement codeRegroupement;

    @Size(max = 30)
    @Column(name = "STCDSC", length = 30, columnDefinition = "char(30)")
    private String description;
....
}


Wen we perform the API entityManager.find(classo, pKey); on the entity CodeStatutCanada, it retrieve 2 records instead of one because the discriminator value is not involved into the request. Here the generated output by Hibernate.

Code:
select
codestatut0_.STCCOD as STCCOD147_1_,
codestatut0_.STCCODRGRSTACAN as STCCODRG3_147_1_,
codestatut0_.STCCODNOUV as STCCODNOUV147_1_,
codestatut0_.STCDSC as STCDSC147_1_,
coderegrou1_.DREFCODCLE as DREFCODCLE122_0_,
coderegrou1_.DREFCODDESC as DREFCODD3_122_0_,
coderegrou1_.DREFSUJID as DREFSUJID122_0_
from
SAGE.PLSTATUT_CANADA codestatut0_
left outer join
SAGE.DATA_REF_CODE2_TB coderegrou1_
on codestatut0_.STCCODRGRSTACAN=coderegrou1_.DREFCODCLE
where
codestatut0_.STCCOD=?


The problem is related to the data as we have more than one value for DREFCODCLE. In fact, our primary key is a compound key made of DREFCODCLE + DREFSUJID.

Then, the question is: Is there a way to force the query to have the discriminator value involved into the query ?

Using @DiscriminatorOptions(force = true) does not help neither ! (no JPA compliant - Hibernate specific)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.