首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >惰性获取元素

惰性获取元素
EN

Stack Overflow用户
提问于 2017-10-07 02:24:29
回答 2查看 36关注 0票数 0

我使用join fetch query来获取公司和productSLA,因为公司有用户列表,并且它没有被初始化。因此,当我使用responseentity.ok发送响应时,它抛出了惰性初始化异常。我不想为了这个目的而想要用户列表,有没有什么方法可以把它发送到前端而不会产生惰性的init异常有人建议我使用dto来做这件事。

我在前端使用了angular。当我使用jsp时,我从来没有遇到过这样的问题。

代码语言:javascript
复制
@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

EN

回答 2

Stack Overflow用户

发布于 2017-10-07 03:35:56

假设你的hibernate会话已经在控制器中关闭了(这是一个合理的假设,因为我们不想在spring/hibernate层之外公开我们的hibernate会话),如果你试图访问一个在会话内没有加载的集合,你就会遇到这种类型的问题。

好了!

我还假设您返回的是一个"hibernate托管实体“或集合,而不是DTO。我感觉到的是,当实体被转换成JSON时,所有的getter都会被底层框架调用,除非它们被标记为'ignore‘(或者类似的东西)。或者你的UI正在调用userList,这时它会抛出异常,因为hibernate返回了一个代理。

无论如何,最好返回一个DTO并以您喜欢的方式填充它。返回DTO (或DTO集合)比返回实体更可取的原因有很多。

票数 0
EN

Stack Overflow用户

发布于 2018-05-18 20:15:10

为了解决这个问题,我使用了http消息转换器,

应用程序配置如下所示:

代码语言:javascript
复制
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(jacksonMessageConverter());
    super.configureMessageConverters(converters);
}

代码语言:javascript
复制
public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new Hibernate5Module());
    messageConverter.setObjectMapper(mapper);
    return messageConverter;

}

需要依赖项

代码语言:javascript
复制
<dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-hibernate5</artifactId>
        <version>2.8.7</version>
    </dependency>

对于这个问题,如果您愿意修改每个getter方法,也有一个糟糕的解决方案:jackson 2 object to json ignore lazy loading

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46611820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档