2017-10-06 66 views
0

由於公司具有用戶列表並且它沒有得到初始化,我正在使用聯合提取查詢將product Company與productSLA一起提取。因此,當我使用responseentity.ok發送響應時,它會拋出惰性init異常。我不希望用戶名單爲此目的是否有任何方式我可以發送到前端沒有得到惰性初始化異常有人建議我使用dto做到這一點。惰性提取元素

我在前端使用角度。當我使用jsp時,我從來沒有遇到過這樣的問題。

@Entity 
@Table(name = "USER_TABLE") 
public class User { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer userId; 

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL,fetch=FetchType.EAGER) 
private List<Ticket> raisedTickets; 

@NotNull 
@Column(unique = true) 
@Email(message = "Invalid Email") 
private String email; 

@NotNull 
@Column 
@Length(min = 4, max = 12, message = "First name must be between 4 to 12 character long") 
private String firstName; 

@NotNull 
@Column 
@Length(min = 4, max = 12, message = "Last name must be between 4 to 12 character long") 
private String lastName; 

@NotNull 
@Column 
@Length(min = 8, max = 100, message = "Password must be 4 to 12 character long") 
private String password; 

@NotNull 
@Column 
@Length(min = 3, max = 30, message = "Company Name must be between 3 to 12 character long") 
private String companyName; 

@Column(name = "USER_ROLE") 
@Enumerated(EnumType.STRING) 
private UserRolesEnum userRole; 

@ManyToOne 
@JoinColumn(name = "COMPANY_ID", nullable = false) 
@NotNull 
private Company company; 

@OneToMany(mappedBy="user", cascade=CascadeType.ALL) 
private List<ProductAssociated> productAssociatedList=new ArrayList<ProductAssociated>(); 

public User() { 
} 

public User(String firstName, String lastName, String email, String password, String companyName, 
    UserRolesEnum role) { 
    super(); 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.email = email; 
    this.password = password; 
    this.companyName = companyName; 
    this.userRole = role; 
} 

public Integer getUserId() { 
    return userId; 
} 

public void setUserId(Integer id) { 
    this.userId = id; 
} 

public List<Ticket> getRaisedTickets() { 
    return raisedTickets; 
} 
public void setRaisedTickets(List<Ticket> raisedTickets) { 
    this.raisedTickets = raisedTickets; 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getLastName() { 
    return lastName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public String getCompanyName() { 
    return companyName; 
} 

public void setCompanyName(String companyName) { 
    this.companyName = companyName; 
} 

public UserRolesEnum getUserRole() { 
    return userRole; 
} 

public void setUserRole(UserRolesEnum userRole) { 
    this.userRole = userRole; 
} 

public Company getCompany() { 
    return company; 
} 

public void setCompany(Company company) { 
    this.company = company; 
} 

public List<ProductAssociated> getProductAssociatedList() { 
    return productAssociatedList; 
} 

public void setProductAssociatedList(List<ProductAssociated> productAssociatedList) { 
    this.productAssociatedList = productAssociatedList; 
} 

public void addProductAssociated(ProductAssociated productAssociated) { 
    productAssociatedList.add(productAssociated); 
    productAssociated.setUser(this); 
} 





    @Entity 
@Table(name="PRODUCT_SLA") 
public class ProductSLA { 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="SLA_ID") 
private Integer slaId; 

@NotNull 
@Column(name="RESPONSE_TIME") 
private int responseTime; 

@Column(name="RESOLVE_TIME") 
private int resolveTime; 

@NotNull 
@Column(name="PRIORITY") 
@Enumerated(EnumType.STRING) 
private PriorityEnum priority; 

@ManyToOne 
@JoinColumn(name="COMPANY_ID", nullable = false) 
private Company company; 

@ManyToOne 
@JoinColumn(name="PRODUCT_ID", nullable = false) 
private Product product; 

public ProductSLA() { 
    super(); 
} 

public ProductSLA(Integer slaId, int responseTime, int resolveTime, PriorityEnum priority) { 
    super(); 
    this.slaId = slaId; 
    this.responseTime = responseTime; 
    this.resolveTime = resolveTime; 
    this.priority = priority; 
} 

public Integer getSlaId() { 
    return slaId; 
} 

public void setSlaId(Integer slaId) { 
    this.slaId = slaId; 
} 

public int getResponseTime() { 
    return responseTime; 
} 

public void setResponseTime(int responseTime) { 
    this.responseTime = responseTime; 
} 

public int getResolveTime() { 
    return resolveTime; 
} 

public void setResolveTime(int resolveTime) { 
    this.resolveTime = resolveTime; 
} 

public PriorityEnum getPriority() { 
    return priority; 
} 

public void setPriority(PriorityEnum priority) { 
    this.priority = priority; 
} 

public Company getCompany() { 
    return company; 
} 

public void setCompany(Company company) { 
    this.company = company; 
} 

public Product getProduct() { 
    return product; 
} 

public void setProduct(Product product) { 
    this.product = product; 
} 

} 



    @Entity 
@Table(name = "COMPANY_TABLE") 
public class Company { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "COMPANY_ID") 
private Integer companyId; 

@NotNull 
@Column(name = "COMPANY_NAME", unique = true) 
private String companyName; 

@NotNull 
@Column(name = "ADDRESS_LINE1") 
private String addressLine1; 

@Column(name = "ADDRESS_LINE2") 
private String addressLine2; 

@NotNull 
@Column(name = "CITY") 
private String city; 

@NotNull 

@Column(name="STATE_NAME") 

private String state; 

@NotNull 
@Column(name = "COUNTRY") 
private String country; 

@NotNull 
@Column(name = "PHONE") 
private String phone; 

@NotNull 
@Column(name = "POSTAL_CODE") 
private String postalCode; 

@NotNull 
@Column(name = "COMPANY_WEBSITE") 
private String companyWebsite; 

@OneToMany(mappedBy = "company", cascade = CascadeType.ALL) 
private List<User> userList = new ArrayList<User>(); 

@OneToMany(mappedBy = "product", cascade = CascadeType.ALL) 
private List<ProductSLA> productSLAList = new ArrayList<ProductSLA>(); 

@OneToMany(mappedBy = "company", cascade = CascadeType.ALL, orphanRemoval=true) 
private List<AccessLevel> accessLevelList=new ArrayList<AccessLevel>(); 

public Company() { 
    super(); 
} 

public Company(Integer companyId, String companyName, String addressLine1, String addressLine2, String city, 
    String state, String country, String phone, String postalCode, String companyWebsite) { 
    super(); 
    this.companyId = companyId; 
    this.companyName = companyName; 
    this.addressLine1 = addressLine1; 
    this.addressLine2 = addressLine2; 
    this.city = city; 
    this.state = state; 
    this.country = country; 
    this.phone = phone; 
    this.postalCode = postalCode; 
    this.companyWebsite = companyWebsite; 
} 

public Integer getCompanyId() { 
    return companyId; 
} 

public void setCompanyId(Integer companyId) { 
    this.companyId = companyId; 
} 

public String getCompanyName() { 
    return companyName; 
} 

public void setCompanyName(String companyName) { 
    this.companyName = companyName; 
} 

public String getAddressLine1() { 
    return addressLine1; 
} 

public void setAddressLine1(String addressLine1) { 
    this.addressLine1 = addressLine1; 
} 

public String getAddressLine2() { 
    return addressLine2; 
} 

public void setAddressLine2(String addressLine2) { 
    this.addressLine2 = addressLine2; 
} 

public String getCity() { 
    return city; 
} 

public void setCity(String city) { 
    this.city = city; 
} 

public String getState() { 
    return state; 
} 

public void setState(String state) { 
    this.state = state; 
} 

public String getCountry() { 
    return country; 
} 

public void setCountry(String country) { 
    this.country = country; 
} 

public String getPhone() { 
    return phone; 
} 

public void setPhone(String phone) { 
    this.phone = phone; 
} 

public String getPostalCode() { 
    return postalCode; 
} 

public void setPostalCode(String postalCode) { 
    this.postalCode = postalCode; 
} 

public String getCompanyWebsite() { 
    return companyWebsite; 
} 

public void setCompanyWebsite(String companyWebsite) { 
    this.companyWebsite = companyWebsite; 
} 

public List<User> getUserList() { 
    return userList; 
} 

public void setUserList(List<User> userList) { 
    this.userList = userList; 
} 

public void addUser(User user) { 
    userList.add(user); 
    user.setCompany(this); 
} 

public List<ProductSLA> getProductSLAList() { 
    return productSLAList; 
} 

public void setProductSLAList(List<ProductSLA> productSLAList) { 
    this.productSLAList = productSLAList; 
} 

public void addProductSLA(ProductSLA productSLA) { 
    productSLAList.add(productSLA); 
    productSLA.setCompany(this); 
} 


public List<AccessLevel> getAccessLevelList() { 
    return accessLevelList; 
} 

public void setAccessLevelList(List<AccessLevel> accessLevelList) { 
    this.accessLevelList = accessLevelList; 
} 

public void addAccessLevel(AccessLevel accessLevel) { 
    accessLevelList.add(accessLevel); 
    accessLevel.setCompany(this); 
} 
} 

編輯 我找到的解決辦法,但我很困惑哪一個使用以及如何使用,因爲有很多的解決方案在那裏。 Avoid Jackson serialization on non fetched lazy objects

回答

0

假設你的Hibernate Session已經關閉,在控制器(這是一個合理的假設作出,因爲我們不希望暴露我們的Hibernate Session外面春/休眠層),你會遇到這種類型的問題,如果您嘗試訪問會話內部未加載的集合。

好吧!

我還假設你正在返回一個或一組「hibernate管理實體」而不是DTO。我感覺到的是,當這個實體轉換成JSON時,所有的getter都被底層框架調用,除非它們被標記爲「忽略」(或類似的東西)。 OR可能是你的UI正在調用userList,因爲代理是由hibernate返回的,所以它拋出異常。

無論如何,最好是返回一個DTO並以您喜歡的方式填充它。返回DTO(或DTO的集合)優於返回實體的原因有很多種。

+1

爲了避免創建一個DTO和相關的映射代碼的努力al替代方法是使用返回一個JsonView,它將排除懶惰字段。 https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring –

+0

我不會遵循公認的解決方案;對於簡單的情況它可能很容易工作,但爲複雜情況提供定製支持可能會很棘手。我建議你使用ModelMapper或JsonView(如@Alan建議的)或其他一些DTO處理框架。 –