Ecco un POJO semplificata che ho:Jersey API + JPA/Hibernate Criteri lazy loading non funziona
@Entity
@Table(name = "Patient")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
(
name="Discriminator",
discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue(value="P")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Patient implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID", unique = true, nullable = false)
protected Integer ID;
@ManyToOne(targetEntity = TelephoneType.class, fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name="IDPhoneType")
protected TelephoneType phoneType;
@JsonProperty(required=false, value="phoneType")
public TelephoneType getPhoneType() {
return phoneType;
}
public void setPhoneType(TelephoneType phoneType) {
this.phoneType = phoneType;
}
}
Ora qui è la mia classe TelephoneType:
@Entity
@Table(name = "TelephoneType")
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@JsonAutoDetect(getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, fieldVisibility=Visibility.NONE)
public class TelephoneType implements Serializable{
private static final long serialVersionUID = -3125320613557609205L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID", unique = true, nullable = false)
private Integer ID;
@Column(name = "Name")
private String name;
@Column(name = "Description")
private String description;
public TelephoneType() {
}
@JsonProperty(value="id")
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
@JsonProperty(value="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JsonProperty(value="description")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
La ragione io uso l'annotazione @JsonAutoDetect in TelephoneType è prima di personalizzare i nomi delle proprietà json (ho bisogno di disattivare il jsonautodetect predefinito) e anche perché se non lo faccio, I ge t un errore durante il recupero della coda
Nessun serializzatore trovato per la classe org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer e immobili scoperti per creare BeanSerializer (per evitare eccezioni, disabilitare SerializationFeature.FAIL_ON_EMPTY_BEANS)) (attraverso catena di riferimento: my.package.Patient [ "PHONETYPE"] -> my.package.TelephoneType _ _ $$ jvste17_13 [ "handler"])
Quindi, senza l'annotazione @JsonAutoDetect ottengo l'errore e con l'annotazione no Lazy Loading si verifica e TelephoneType viene sempre caricato nella risposta JSON.
ho utilizzare i criteri per rendere la query:
return this.entityManager.find(Patient.class, primaryKey);
Ho anche aggiunto, come ho letto in diversi messaggi su così, quanto segue nella web.xml della mia applicazione (API Jersey):
<filter>
<filter-name>OpenEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Ora in qualche modo ho sicuramente perso qualcosa nella mia configurazione, ma non riesco a capire cosa e abbiamo molti rapporti @ManyToOne nel dB che rallentano l'API considerevole (alcuni oggetti più pesante di quello ho mostrato nel esempio) così Mi piacerebbe davvero trovare un modo per attivare questa cosa di caricamento pigro ...
Potrebbe rimuovere il filtro OpenEntityManagerInViewFilter e vedere che cosa è successo? – xsalefter
se lo rimuovo, questo è il classico errore che ottengo: "Impossibile inizializzare lentamente una raccolta di ruoli: ca.chronometriq.commons.cmqmodel.Patient.TelephoneType, impossibile inizializzare il proxy - nessuna sessione (tramite la catena di riferimenti: ca. chronometriq.commons.cmqmodel .... " – jon