2017-10-06 51 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处理框架。 –