SchoolDto取延遲初始化對象負載:而不休眠春
@Id
@Column(name = "c_sm_npk_id", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "school_sequence")
@SequenceGenerator(name = "school_sequence", sequenceName = "t_school_master_c_sm_npk_id_seq", initialValue = 1, allocationSize = 1)
private Long id;
@Column(name="c_sm_vnm_name")
private String name;
@ManyToOne(cascade = {CascadeType.MERGE},fetch=FetchType.LAZY)
UserDto owner;
/*Many other fileds omit for simplicity with getter/setter methods*/
UserDto
public class UserDto implements Serializable {
private static final long serialVersionUID = 1L;
public UserDto() {
}
@Id
@Column(name = "c_um_npk_id", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_sequence")
@SequenceGenerator(name = "user_sequence", sequenceName = "t_user_master_c_um_npk_id_seq", initialValue = 1, allocationSize = 1)
private Long id;
@Column(name = "c_um_vnm_username", nullable = false)
private String username;
@Column(name = "c_um_vnm_email_address")
private String emailId;
@JsonSerialize(using = JsonDateSerializer.class)
@Column(name = "c_um_dnm_birth_date",nullable=false)
@Temporal(TemporalType.DATE)
private Date birthdate;
@Column(name="c_um_nnm_age",nullable=false)
private int age;
@Column(name = "c_um_vnm_first_name")
private String firstName;
@Column(name = "c_um_vnm_last_name")
private String lastName;
@Column(name = "c_um_vnm_mobile_number")
private String mobileNumber;
@Column(name = "c_um_vnm_gender")
private String gender;
@JsonManagedReference("user-role")
@OneToMany(mappedBy = "userDto", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<RoleDto> roleDtos;
/* getter setter of properties */
}
在這裏,我已經擁有者定義爲延遲集合。但是當我試圖找到下面所有的學校:
public List<SchoolDto> getAllSchoolsWithAdvanceSearch(SchoolSearchDto schoolSearchDto) {
return getEntityManager().createQuery("SELECT s from SchoolDto s").setFirstResult(schoolSearchDto.getFrom()).setMaxResults(schoolSearchDto.getSize()).getResultList();
}
學校這個返回列表,其所有的所有者信息包括所有者的角色(這又是懶惰的集合形式UserDto),當我登錄Hibernate查詢,我得到的只有一個選擇,如下:
select
schooldto0_.c_sm_npk_id as c1_24_,
schooldto0_.c_sm_vnm_address_line_1 as c2_24_,
schooldto0_.owner_c_um_npk_id as owner17_24_
from
t_school_master schooldto0_
搜索過程中,我遇到過,這可能是傑克遜的序列化的問題,所以我做了如下改變按jackson - do not serialize lazy objects & Avoid Jackson serialization on non fetched lazy objects如下
應用servlet.xml中
<mvc:annotation-driven>
<mvc:message-converters>
<ref bean="jsonHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.util.HibernateAwareObjectMapper" />
</property>
</bean>
HibernateAwareObjectMapper.java
public HibernateAwareObjectMapper() {
this.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
Hibernate4Module module = new Hibernate4Module();
module.configure(Hibernate4Module.Feature.FORCE_LAZY_LOADING, false);
module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
registerModule(module);
}
注:我需要主人後面詳細,所以我不能將其標記爲@JsonIgnore
。
請幫我解決這個問題。在此先感謝
編輯:電流輸出
0: {
"id": 1
"name": "school1"
"address1": null
owner : {
"id" : 1,
"firstName": "Rutesha",
"lastName" : "Patel",
"roles":[{
"name" : "SCHOOL_ADMIN"
}]
}
}
編輯:預期輸出
0: {
"id": 1
"name": "school1"
"address1": null
}
OR
0: {
"id": 1
"name": "school1"
"address1": null
owner : null
}
什麼預期輸出? –
我已經爲預期輸出添加了我的問題。它最初不應該加載惰性對象 –
返回getEntityManager()。createQuery(「來自SchoolDto s的」SELECT s.id,s.name,s.address1「)。setFirstResult(schoolSearchDto.getFrom())。setMaxResults(schoolSearchDto.getSize())。getResultList(); –