Java spring jpa中对象数组的JsonMappingException
当我试图从我的dbms中获取项目时,我得到一个错误。跟随误差Java spring jpa中对象数组的JsonMappingException,java,spring,jpa,jackson,Java,Spring,Jpa,Jackson,当我试图从我的dbms中获取项目时,我得到一个错误。跟随误差 com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.pharmawizardcabinet.core.entity.cabinet.Cabinet.listaFarmaci, could not initialize proxy - no Session (through r
com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.pharmawizardcabinet.core.entity.cabinet.Cabinet.listaFarmaci, could not initialize proxy - no Session (through reference chain: com.pharmawizardcabinet.web.beans.ResponseCabinet["cabinet"]->com.pharmawizardcabinet.core.entity.cabinet.Cabinet["listaFarmaci"])
这是我的座右铭
@Entity
@Table(name = "Cabinet")
public class Cabinet implements Serializable {
private static final long serialVersionUID = 7311927404447970875L;
@Id
@Column(name = "Id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long Id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "cabinet")
private List<Farmaco> listaFarmaci;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "user")
private User user;
@Column(name = "timestamp")
@Temporal(TemporalType.DATE)
private Date setLastModified;
public Cabinet() {
}
@PostPersist
@PostUpdate
private void setLastUpdate() {
this.setLastModified = new Date();
}
public List<Farmaco> getListaFarmaci() {
return listaFarmaci;
}
public void setListaFarmaci(List<Farmaco> listaFarmaci) {
this.listaFarmaci = listaFarmaci;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
public Date getSetLastModified() {
return setLastModified;
}
public void setSetLastModified(Date setLastModified) {
this.setLastModified = setLastModified;
}
}
这是谁
@Component("managerCabinet")
public class ManagerCabinet {
private static Logger logger = Logger.getLogger(ManagerCabinet.class);
@PersistenceContext(name = "pwcabinet-jpa")
private EntityManager entityManager;
@Transactional
public Cabinet getCabinetByUser(User user) {
logger.debug("[getCabinetByUser] user: " + user.getId());
return _getCabinetByUser(user);
}
private Cabinet _getCabinetByUser(User user) {
logger.debug("[_getCabinetByUser] user: " + user.getId());
User find = entityManager.find(User.class, user.getId());
Query searchCabinetByUser = entityManager.createQuery("Select c from Cabinet c where c.user = :userId", Cabinet.class);
searchCabinetByUser.setParameter("userId", find);
Cabinet cabinetSearch = (Cabinet) searchCabinetByUser.getSingleResult();
cabinetSearch.setUser(find);
return cabinetSearch;
}
}
但我继续得到错误
如果我这样使用注释@JsonIgnore
@JsonIgnore
public List<Farmaco> getListaFarmaci() {
return listaFarmaci;
}
它们有效,但我需要在结果中包含这些信息。如何解决它?当您的方法private Cabinet\u getCabinetByUserUser返回时,Cabinet实例将处于“分离”状态,即。不再与持久性上下文关联
当项目处于分离状态时,可以不再访问非急切获取的关联
因为@OneToMany的默认抓取在您的情况下是懒惰的
@OneToMany(cascade = CascadeType.ALL, mappedBy = "cabinet")
private List<Farmaco> listaFarmaci;
一旦加载的文件柜与持久性上下文分离,就无法再访问listaFarmaci字段
您有各种处理方法,包括:
将字段标记为急切获取并不好,因为无论是否需要,总是会急切获取。
强制持久性上下文保持打开状态直到所有处理完成通常称为OpenSessionInView模式或反模式,具体取决于您的观点:
确保在分离之前初始化用例所需的所有数据。实现这一目标有多种方法:
简单地访问集合是一种方式,例如通过调用size,但这可能不适用于所有JPA提供商
在加载文件柜的JPQL查询中指定FETCH JOIN,尽管这有副作用 我已经修改了_getCabinetbyUsers来检查listaFarmaco的大小,它可以正常工作。谢谢
@OneToMany(cascade = CascadeType.ALL, mappedBy = "cabinet")
private List<Farmaco> listaFarmaci;