Hibernate与SparkJava不兼容?
我在惰性加载模式下使用Hibernate和SparkJava时出错 在没有SparkJava的情况下,它可以正常工作,但在使用SparkJava时,它试图强制对OneToMany关系进行急切加载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=“供
-型号
@实体
@表(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
}
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();