JPA-Vererbung mit SINGLE_TABLE - Diskriminator-Wert nicht mit dem übereinstimmt, Klasse

Ich habe ein seltsames Verhalten mit einem JPA-Klassen-Hierarchie mit einer einzigen Tabelle.
Im Grunde habe ich zwei Entitäten EntityMapA und EntityMapB die beiden verlängern EntityMap. Die Diskriminator-Wert ist 'ENTITY_TYPE', und es ist Ein für EntityMapA und B für EntityMapB.
Irgendwie bekomme ich Objekte vom Typ EntityMapA wo der Diskriminator den Wert 'B'!

Ich bin mit Hibernate 3.3 als JPA-provider.

Hier ist der code:

@Entity
@Table(name="ENTITY_MAP")
@DiscriminatorColumn(name = "ENTITY_TYPE")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class EntityMap implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private Long entityMapId;

    //This is a ID of another entity we map to. It is a different entity type depending on 
    //The subclass. For EntityMapA it would map to EntityA and for EntityMapB it would map   
    //to EntityB
    private Long entityId;


    private String discriminator;

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "ENTITY_MAP_ID", unique = true, nullable = false)
    public Long getEntityMapId() {
        return entityMapId;
    }
    public void setEntityMapId(Long EntityMapId) {
        this.entityMapId = entityMapId;
    }


    @Column(name="ENTITY_TYPE",insertable=false,updatable=false)
    public String getDiscriminator() {
        return discriminator;
    }
    public void setDiscriminator(String discriminator) {
        this.discriminator = discriminator;
    }

    @Column(name="ENTITY_ID",insertable=false,updatable=false)
    public Long getEntityId() {
        return entityId;
    }
    public void setEntityId(Long entityId) {
        this.entityId = entityId;
    }

    //there are other common fields in here which are left out    
}


@Entity
@DiscriminatorValue("A")
public class EntityMapA extends EntityMap {

    /**
     *
     */
    private static final long serialVersionUID = -8709307036005000705L;

    private EntityA entityA;

    public static final String DISCRIMINATOR = "A";

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ENTITY_ID", nullable = false)
    @NotNull
    public EntityA getEntityA() {
        return entityA;
    }

    public void setEntityA(EntityA entityA) {
        this.entityA = entityA;
    }

}



@Entity
@DiscriminatorValue("B")
public class EntityMapB extends EntityMap {

    /**
     *
     */
    private static final long serialVersionUID = -8709307036005000705L;

    public static final String DISCRIMINATOR = "B";

    private EntityB entityB;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ENTITY_ID", nullable = false)
    @NotNull
    public EntityB getEntityB() {
        return entityB;
    }

    public void setEntityB(EntityB entityB) {
        this.entityB = entityB;
    }
}

Und dann endlich habe ich eine Zuordnung in EntityA:

    @OneToMany(cascade=CascadeType.ALL,fetch = FetchType.LAZY, mappedBy = "entityA")
    public List<EntityMapA> getEntityMaps() {
        return entityMaps;
    }

    public void setEntityMaps(List<EntityMapA> entityMaps) {
        this.entityMaps = entityMaps;
    }

Nun habe ich ein ENTITY_MAP Zeile mit ENTITY_TYPE = "B" und ENTITY_ID = "12345"
Es gibt sowohl eine EntityA mit der id "12345" und ein EntityB mit der ID "12345".

Wenn ich jetzt laden EntityA mit der id "12345" ist, hat einen Eintrag in der getEntityMaps() vom Typ EntityMapA aber die Diskriminator-Wert auf, dass EntityMapA ist 'B'.

Was läuft hier falsch? Warum ist eine Zeile mit dem Diskriminator 'B' zugeordnet EntityMapA Entität?

Ist es, weil ich anzeigen die EntityId zweimal (einmal mit @Column(name="ENTITY_TYPE",einsetzbaren=false,updatable=false) auf der übergeordneten Klasse und dann wieder pro JoinColumn, um die wirkliche Einheit?

UPDATE
Btw, die EntityMapA aufgelistet in der Auflistung auf EntityA ist nie wirklich geschaffen. Wenn Sie versuchen, laden Sie die Person, für die Sie eine Ausnahme und sagt Ihnen, dass diese Entität nicht existiert. Also sieht aus wie ein bug in Hibernate zu mir.

InformationsquelleAutor Ben | 2012-06-15
Schreibe einen Kommentar