2016-07-13 110 views
0

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 
} 
+0

什麼預期輸出? –

+0

我已經爲預期輸出添加了我的問題。它最初不應該加載惰性對象 –

+0

返回getEntityManager()。createQuery(「來自SchoolDto s的」SELECT s.id,s.name,s.address1「)。setFirstResult(schoolSearchDto.getFrom())。setMaxResults(schoolSearchDto.getSize())。getResultList(); –

回答

0

執行以下更改

return getEntityManager().createQuery("SELECT s.id,s.name,s.address1 from SchoolDto s").setFirstResult(schoolSearchDto.getFrom()).setMaxResults(schoolSearchDto.getS‌​ize()).getResultList(); 

@ManyToOne - 像根據文檔註釋有相同的問題,但在這種情況下,JPA提供者更可能考慮FetchType提示。

@ManyToOne(cascade={CascadeType.MERGE},optional = false,fetch=FetchType.LAZY) 
UserDto owner; 

此外,以下注釋可以幫助。

@OneToMany(fetch = FetchType.LAZY, mappedBy = "owner") 
@Cascade(CascadeType.ALL) 
@Fetch(FetchMode.SELECT) 
@BatchSize(size = 10) 

可能應該使用@JoinColumn(name="other_entity_fk")

對於實施例

@ManyToOne(fetch = FetchType.LAZY) 
@Fetch(FetchMode.SUBSELECT) 
@JoinColumn(name = "STOCK_ID", nullable = false) 
public Stock getStock() { 
    return this.stock; 
} 

參考Strategies for Fetch mode

+0

我已經嘗試過,我知道它的工作原理,但後來如果我在上面的列表中添加所有者而不是再次獲取角色。也有很多領域。所以我需要一些通用解決方案。 –

+0

我想檢查你的POJO,請編輯並顯示。學校和所有者。 –

+0

我有編輯問題所有者POJO –