Hibernate与SparkJava不兼容?

Hibernate与SparkJava不兼容?,java,hibernate,lazy-initialization,spark-java,Java,Hibernate,Lazy Initialization,Spark Java,我在惰性加载模式下使用Hibernate和SparkJava时出错 在没有SparkJava的情况下,它可以正常工作,但在使用SparkJava时,它试图强制对OneToMany关系进行急切加载 -型号 @实体 @表(name=“KU_供应商”) 公共类供应商{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) 私有int-id; @NotEmpty(message=“请提供名称”) 私有字符串名称; @OneToMany(mappedBy=“供

我在惰性加载模式下使用Hibernate和SparkJava时出错

在没有SparkJava的情况下,它可以正常工作,但在使用SparkJava时,它试图强制对OneToMany关系进行急切加载


-型号

@实体
@表(name=“KU_供应商”)
公共类供应商{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有int-id;
@NotEmpty(message=“请提供名称”)
私有字符串名称;
@OneToMany(mappedBy=“供应商”)
私有列表项;//应延迟加载
//构造函数/获取器/设置器
}

-DAO

公共类SupplierDao实现Dao{
私人最终会议工厂会议工厂;
公共供应商DAO(SessionFactory SessionFactory){
this.sessionFactory=sessionFactory;
}
@凌驾
@抑制警告(“未选中”)
公共列表findAll(){
try(Session Session=sessionFactory.openSession()){
return session.createQuery(“FROM com.seafrigousa.model.Supplier”).getResultList();
}
}
}

-Main

//工作正常,可根据需要延迟加载项目
supplierDao.findAll();
//当web浏览器转到“localhost/suppliers”时,将调用该方法
//它抛出org.hibernate.LazyInitializationException:未能延迟初始化角色集合:model.Supplier.items,无法初始化代理-无会话
获取(“/suppliers”,“application/json”,supplierDao::findAll);

通过不关闭DAO中的会话进行检查,我看到Hibernate正在执行查询,就好像它处于急切加载模式一样,因此它正在执行两个选择,一个用于供应商,一个用于项目

这种行为有什么原因吗


谢谢大家!

我猜这里:
get(“/suppliers”,“application/json”,supplierDao::findAll)
您正在将供应商对象序列化为json<代码>项
字段未标记为已从序列化中排除,因此获取其值会导致延迟初始化退出会话(如果会话未关闭,则会导致冗余并再次查询项)

如果我的猜测是正确的,请让序列化程序忽略项字段或在查询中获取它们

session.createQuery("FROM com.seafrigousa.model.Supplier s join fetch s.items").getResultList();
使用gson作为序列化程序,您有以下选项:

  • @Expose
    对要序列化的字段进行注释

    @Entity
    @Table(name = "KU_SUPPLIER")
    public class Supplier {
    
        @Expose
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
    
        @Expose
        @NotEmpty(message = "Please provide a name")
        private String name;
    
        @OneToMany(mappedBy = "supplier")
        private List<Item> items;  // Should be lazy-loaded
    
        // Constructor / Getters / Setters
    }
    
  • 带有自定义注释f.e.的排除策略

    public class IgnoreFieldExclusionStrategy implements ExclusionStrategy {
    
        @Override
        public boolean shouldSkipField(FieldAttributes fieldAttributes) {
            return fieldAttributes.getAnnotation(GsonIgnore.class) != null;
        }
    
        @Override
        public boolean shouldSkipClass(Class<?> aClass) {
            return false;
        }
    }
    
    和gson启动

    Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
    
    Gson gson = new GsonBuilder().addSerializationExclusionStrategy(new IgnoreFieldExclusionStrategy()).create();
    
    你的班级应该是这样的

    @Entity
    @Table(name = "KU_SUPPLIER")
    public class Supplier {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
    
        @NotEmpty(message = "Please provide a name")
        private String name;
    
        @GsonIgnore
        @OneToMany(mappedBy = "supplier")
        private List<Item> items;  // Should be lazy-loaded
    
        // Constructor / Getters / Setters
    }
    
    和查询:

    session.createQuery("select new com.seafrigousa.dto.SupplierDTO(s.id, s.name) FROM com.seafrigousa.model.Supplier s").getResultList();
    

    我想你也是对的!您能否提供一个使用Gson作为序列化程序(由SparkJava使用)的被忽略字段的示例?唯一缺少的就是接受赏金:)太好了,谢谢你的帮助!这是报酬!:)
    package com.seafrigousa.dto
    
    public class SupplierDTO {
    
        private int id;
        private String name;
    
        public SupplierDTO(int id, String name) {
            this.id = id;
            this.name = name;
       }
    
        // Getters / Setters
    }
    
    session.createQuery("select new com.seafrigousa.dto.SupplierDTO(s.id, s.name) FROM com.seafrigousa.model.Supplier s").getResultList();