当前位置: 首页 > 知识库问答 >
问题:

带有@Any的LazyInitializationException(fetch = fetch type。渴望)和Spring靴

邵阳德
2023-03-14

我得到了一个常见的例外“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的问题,但我无法处理它。提前致谢!

共有1个答案

杜凯
2023-03-14

这不是一个好的解决方案,但它有效。但我想得到更好的。它是带有@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。初始化集合和代理