Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring jpa中对象数组的JsonMappingException_Java_Spring_Jpa_Jackson - Fatal编程技术网

Java spring jpa中对象数组的JsonMappingException

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

当我试图从我的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 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;