微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在不触发休眠延迟加载的情况下访问哈希码

如何解决在不触发休眠延迟加载的情况下访问哈希码

我在使用 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 尝试访问 Manufacturer 的 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。