Вот упрощенная POJO, у меня есть:
@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;
}
}
Теперь вот мой класс 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;
}
}
Причина, по которой я использую аннотацию @JsonAutoDetect в TelephoneType, сначала настраивает имена свойств json (мне нужно было дезактивировать jsonautodetect по умолчанию), а также потому, что , если я этого не сделаю, я получаю сообщение об ошибке при получении очереди
Сериализатор не найден для класса org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer и никаких свойств, обнаруженных для создания BeanSerializer (чтобы исключить исключение, отключите SerializationFeature.FAIL_ON_EMPTY_BEANS)) (через цепочку ссылок: my.package.Patient [ "phoneType" ] → my.package.TelephoneType _ $$ _ jvste17_13 [ "обработчик" ])
Таким образом, без аннотации @JsonAutoDetect я получаю ошибку и с аннотацией no Lazy Loading происходит, и TelephoneType всегда загружается в ответ json.
Я использую критерии для запроса:
return this.entityManager.find(Patient.class, primaryKey);
Я также добавил, что, как я читал в разных сообщениях, следующим образом в web.xml моего приложения (Джерси API):
<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>
Теперь я как-то пропустил что-то в своей конфигурации, но не могу понять, что и у нас есть много отношений @ManyToOne в db, которые значительно замедляют api (некоторые более тяжелые объекты, чем тот, который я показал в примере), поэтому Я бы очень хотел найти способ активировать эту ленивую загрузку...