Ho un problema strano durante il caricamento di alcuni oggetti. Sto utilizzando JPA 1, hibernate-core versione 3.3.0.SP1 e hibernate-EntityManager versione 3.4.0.GAEreditarietà JPA e Hibernate Edizione
Diciamo che ho queste entità JPA:
@Entity
@Table(name = "SLC_ELE")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.INTEGER, name = ElementoPrograma.C_ID_CTG_ELE)
public class Element {
...
}
@Entity
@Table(name = "SLC_ELE_ONE")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue(Categories.ID_CTG_ONE)
public class ElementTypeOne extends Element {
...
}
@Entity
@Table(name = "SLC_ELE_TWO")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue(Categories.ID_CTG_TWO)
public class ElementTypeTwo extends Element {
...
}
@Entity
@Table(name = ThreeElementExample.TABLENAME)
@AssociationOverrides({
@AssociationOverride(name = JpaMany3ManyEntity.ASOCIATION_OVERRIDE_ONE,
joinColumns =
@JoinColumn(name = Element.C_ID_ELE)),
@AssociationOverride(name = JpaMany3ManyEntity.ASOCIATION_OVERRIDE_TWO,
joinColumns =
@JoinColumn(name = OneEntity.C_ID_TWO)),
@AssociationOverride(name = JpaMany3ManyEntity.ASOCIATION_OVERRIDE_THREE,
joinColumns =
@JoinColumn(name = AnotherEntity.C_ID_THREE))})
public class ThreeElementExample extends JpaMany3ManyEntity<Element, OneEntity, AnotherEntity> {
...
}
la cosa è, Mi piacerebbe ottenere sempre le sottoclassi (ovvero ElementTypeOne, ElementTypeTwo invece degli elementi) quando carico una collezione di queste entità. Il problema è che il molti a molti relazione sempre ottenere l'elemento (il padre invece i bambini)
Diciamo che ho un'entità A contenente un colection di elementi:
@Fetch(FetchMode.JOIN)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idEle")
private Collection<Element> elementCollection;
E se ho la collezione, tutto funziona bene (ottengo le sottoclassi come previsto).
Il problema nasce quando ho un altro soggetto B con una collezione del JpaMany3ManyEntity (si noti che lo stesso elemento soggetto è coinvolto)
@OneToMany(cascade = CascadeType.ALL, mappedBy = JpaMany3ManyEntity.ASOCIATION_OVERRIDE_ONE, fetch = FetchType.LAZY)
private Collection<ThreeElementExample> threeElementExampleCollection;
Se io giro della threeElementExampleCollection dalla classe B, prima di cercare di ottenere l'elementoCollection dalla classe A, quando carico gli oggetti dall'elementoCollection Ottengo solo gli oggetti superclasse (Element) invece dei bambini.
Immagino che, per qualsiasi motivo, la relazione molti a molti ottenga sempre gli oggetti Element (padre) e li salva nella cache di ibernazione, ma ho bisogno di evitare questo comportamento.
Qualche idea o workarround? Qualsiasi tipo di aiuto sarebbe molto apprezzato.
Grazie in anticipo.
EDIT: il molti a molti classe:
@SuppressWarnings("serial")
@MappedSuperclass
@AssociationOverrides({
@AssociationOverride(name = JpaMany3ManyEntity.ASOCIATION_OVERRIDE_ONE,
joinColumns =
@JoinColumn(name = "changeMeWhenExtends")),
@AssociationOverride(name = JpaMany3ManyEntity.ASOCIATION_OVERRIDE_TWO,
joinColumns =
@JoinColumn(name = "changeMeWhenExtends")),
@AssociationOverride(name = JpaMany3ManyEntity.ASOCIATION_OVERRIDE_THREE,
joinColumns =
@JoinColumn(name = "changeMeWhenExtends"))})
public abstract class JpaMany3ManyEntity<A extends JpaBaseEntity, B extends JpaBaseEntity, C extends JpaBaseEntity> extends JpaBaseEntity {
public static final String ID_ATTNAME = "id";
public static final String ASOCIATION_OVERRIDE_ONE = JpaMany3ManyEntity.ID_ATTNAME + "." + JpaMany3ManyId.ID_ONE_ATTNAME;
public static final String ASOCIATION_OVERRIDE_TWO = JpaMany3ManyEntity.ID_ATTNAME + "." + JpaMany3ManyId.ID_TWO_ATTNAME;
public static final String ASOCIATION_OVERRIDE_THREE = JpaMany3ManyEntity.ID_ATTNAME + "." + JpaMany3ManyId.ID_THREE_ATTNAME;
...
}
Ti dispiacerebbe aggiungere la definizione di 'JpaMany3ManyEntity' per completezza? –
Nessun problema, ma sono abbastanza sicuro che non si tratti del problema. Ad ogni modo, la domanda è già stata modificata. – elcadro