java - 在不触发 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)
解决方案
推荐阅读
- ruby-on-rails - 当 ko.yml 存在且位于正确的目录中时,出现“I18n::InvalidLocale · “ko”不是有效的语言环境”错误
- java - How to make a SimpleProperty inform listeners on the first set?
- javascript - 在 NodeJS 中使用 Jquery
- json - Codec Json doesn't send data to elasticsearch
- scala - How do I define implicit class that can pimp both base and derived class
- vb.net - vb.net ComboBox 左侧文本更改
- vb.net - .NET Google API 访问令牌失败,未指定刷新令牌
- php - 如何在 php 中使用 (:) 传递数组中的值?
- reactjs - 如何存储组件本地的小块静态数据?
- ruby - 在项目中使用特定的 Ruby 版本