我得到了一个常见的例外“org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话”,尽管“fetch = FetchType.EAGER”,但我不能(wan't)手动管理Hibernate会话(我使用Spring-Boot-starter-data-jpa)。
我有一个Hilder实体,它包含了Common Type(TapeA或TypeB)的属性:
@Entity
public class Holder<T extends CommonType> {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Any(metaColumn = @Column(name = "type", nullable = false), optional = false, fetch = FetchType.EAGER)
@Cascade(org.hibernate.annotations.CascadeType.ALL )
@AnyMetaDef(
idType = "long",
metaType = "string",
metaValues = {
@MetaValue(value = "TypeA", targetEntity = TypeB.class),
@MetaValue(value = "TypeB", targetEntity = TypeA.class)
})
@JoinColumn(name = "property_id", nullable = false)
private T type;
//getters and setters}
TypeB看起来像TypeA:
@Entity
public class TypeA implements CommonType {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private double param=0;
//getters and setters
}
Holder的存储库:
import org.springframework.transaction.annotation.Transactional;
@Transactional
public interface HolderRepository extends CrudRepository<Holder, Long> {
}
跑步者:
@Configuration
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class);
HolderRepository repository = context.getBean(HolderRepository.class);
TypeA simpleDeviceState = new TypeA();
Holder<TypeA> holder = new Holder<>(simpleDeviceState);
repository.save(holder);
Holder holder1=repository.findAll().iterator().next();
TypeA typeA= (TypeA) holder1.getType();
System.out.println("Param: "+typeA.getParam());
context.close();
}}
Pom仅包含org.springframework.boot::spring-boot-starter-data-jpa和com. h2datase::h2。
在打印点中出现异常。我想我得到 org.hibernate.LazyInitializationException 是因为 fetch = FetchType.EAGER 不起作用。
此外,级联仅适用于持久性。也许是混合Hibernate和JPA的问题,但我无法处理它。提前致谢!
这不是一个好的解决方案,但它有效。但我想得到更好的。它是带有@Transactional和Hibernate.initialize的服务:
@Component
@Transactional
public class ServiceHolder {
@Autowired
HolderRepository holderRepository;
public Holder getH(long id) {
Holder holder = holderRepository.findOne(id);
Hibernate.initialize(holder.getType());
return holder;
}
}
使用JPA EntityManager和JPA查询对象,我如何覆盖在查询中惰性获取注释@OneToMany(fetch=FetchType.EAGER)的内容? 如果我有hibernate查询对象,我可以让它创建一个criteria对象,并使用它将fetch类型设置为lazy。但我必须使用JPA查询对象。这个问题有什么解决办法吗?
我刚刚开始了解FetchType Lazy和Eager。我明白其中的区别,但即使我设置为Lazy,它仍然试图获取相关数据。 关系:1人:多部手机 查看的研究尝试和教程: https://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/ http://howtodoinjava.com/hi
问题内容: 好吧,我对此完全感到困惑。我正在尝试构建按类别组织的已发布网页菜单。 Category.rb: Page.rb Page模型还具有:is_published,因此我也尝试对其进行过滤。我不愿意发布我微不足道的查询尝试,但是除了乞求更聪明的人之外,没有其他解决方案: (自己是@current_website) 这大部分返回我需要的内容,但没有返回未发布页面的父类别。例如,如果我有以下方法
我正在使用Spring-JPA。我有两个测试。 此方法失败,出现以下异常: 配置:
我正在使用JPA2CriteriaBuilder构建一个查询,并使用Hibernate4作为我的提供者。我一直在玩FetchModes,并得出结论,选择是我需要的。但选择forces将启用FetchType.Lazy。我在什么地方读到这篇文章,似乎是这样的。 在Devices类中,此配置会产生正确的结果: 但是,我不希望在我的实体中硬编码FetchType=Eager。我想控制提取发生的时间,我想
问题内容: 为什么我不能将EAGER提取用于同一目的 问题答案: 最后,您可以使用EAGER提取来获得相同的结果。但这意味着 总会 热切地加载东西(相对于您只需要加载)。这是你想要的吗? 参考文献 Hibernate Core参考指南 20.1.4。初始化集合和代理