首页 > 解决方案 > 在不触发 Hibernate 延迟加载的情况下访问哈希码

问题描述

我对 Hibernate 有一点问题,我希望有人能解决这个问题。我有两个实体,产品和制造商,它们具有多对多关系。在产品方面,有一组制造商定义为:

@ContainedIn
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "products_to_manufacturers", inverseJoinColumns = {
        @JoinColumn(name = "manufacturer_id", referencedColumnName = "id") }, joinColumns = {
                @JoinColumn(name = "product_id", referencedColumnName = "id") })
@OrderBy("name")
@AuditJoinTable(inverseJoinColumns = { @JoinColumn(name = "manufacturer_id", referencedColumnName = "id") })
protected Set<Manufacturer> manufacturers;

public Set<Manufacturer> getManufacturers()
{
    if (manufacturers == null)
    {
        manufacturers = new HashSet<Manufacturer>();
    }
    return manufacturers;
}

public void setManufacturers(Set<Manufacturer> manufacturers)
{
    getManufacturers().clear();
    if (manufacturers != null)
    {
        getManufacturers().addAll(manufacturers);
    }
}

private Product updateProductMfgs(Product product, Set<BigInteger> mfgIds)
    {
        Set<Manufacturer> mfgs = new HashSet<Manufacturer>();
        if (mfgIds != null)
        {
            for (BigInteger mfgId : mfgIds)
            {
                Manufacturer mfg = entityManager.getReference(Manufacturer.class, mfgId);
                if (mfg != null)
                {
                    mfgs.add(mfg);
                }
            }
        }
        product.setManufacturers(mfgs);
        return product;
    }

我需要能够调用 setManufacturers() 而不触发制造商的延迟加载。理论上这应该有效,但是一旦 HashSet 尝试访问制造商的 hashCode() 方法,它就会出于某种原因启动延迟加载。我看了一些关于如何实现 hashCode 和 equals 的文章(比如这篇:https ://vladmihalcea.com/the-best-way-to-implement-equals-hashcode-and-tostring-with-jpa-and -hibernate/ ) 但我找到的信息都不是相关的。延迟加载只需调用 hashCode(); 即可触发。它从未真正实现过。

有谁知道我能做些什么来解决这个问题?是否有用于休眠的设置或配置选项可以修改延迟加载行为?

更新: 这是任何想要它的人的堆栈跟踪

Caused by: org.hibernate.LazyInitializationException: could not initialize proxy [com.tura.common.domain.Manufacturer#2] - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:169)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:309)
    at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyInterceptor.java:45)
    at org.hibernate.proxy.ProxyConfiguration$InterceptorDispatcher.intercept(ProxyConfiguration.java:95)
    at com.tura.common.domain.Manufacturer$HibernateProxy$cdTL8c5F.hashCode(Unknown Source)
    at java.util.HashMap.hash(HashMap.java:338)
    at java.util.HashMap.put(HashMap.java:611)
    at java.util.HashSet.add(HashSet.java:219)
    at com.tura.product.service.test.Test.testCreateNewFrame(Test.java:1793)

标签: javahibernatejpalazy-loadinghashcode

解决方案


推荐阅读