2017-10-06 3 views
0

회사에 사용자 목록이 있고 초기화되지 않았기 때문에 조인 가져 오기 쿼리를 사용하여 productSLA와 함께 회사를 가져옵니다. 따라서 responseentity.ok를 사용하여 응답을 보내면 지연 초기화 예외가 발생합니다. 나는 그 목적을 위해 사용자 목록을 원하지 않는다. 프론트 엔드에 게으른 초기화 예외를 보내지 않고서 그것을 보낼 수있는 방법이있다. 어떤 것은 내가 이것을 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

당신은 이러한 유형의 문제의 경우에 실행됩니다 (외부 봄/최대 절전 모드 레이어 우리의 최대 절전 모드 세션을 노출하지 않기 때문에 만들 수있는 공정한 가정이다) 컨트롤러에 이미 폐쇄 세션 내에있을 때로드되지 않은 콜렉션에 액세스하려고 시도합니다.

괜찮 았어!

또한 DTO와 반대로 "최대 절전 모드로 관리되는 엔터티"를 반환한다고 가정합니다. 내가 느끼는 것은 엔티티가 JSON으로 변환 될 때 모든 getter가 '무시'(또는 이와 비슷한 것)으로 표시되지 않는 한 기본 프레임 워크에 의해 호출된다는 것입니다. 또는 귀하의 UI가 userList를 호출하는 시점에서 프록시가 최대 절전 모드에서 반환 되었기 때문에 예외가 발생합니다.

상관없이 DTO를 반환하고 원하는 방식으로 채우는 것이 좋습니다. 엔티티를 반환하는 것보다 DTO (또는 DTO 모음)를 반환하는 것이 더 좋은 이유는 다양합니다.

+1

DTO와 관련 매핑 코드를 만들지 않으려면 지연 필드를 제외하는 JsonView를 return하는 것이 좋습니다. https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring –

+0

나는 받아 들인 해결책을 따르지 않을 것이다; 간단한 경우에는 쉽게 작동하지만 복잡한 경우에는 사용자 정의 지원을 제공하는 것이 까다로울 수 있습니다. ModelMapper 또는 JsonView (@Alan이 제안한대로) 나 다른 DTO 핸들링 프레임 워크를 사용할 것을 제안합니다. –