我正在使用Hibernate
4.3.6,并且使用了最新的Maven字节码增强功能来检测所有实体是否具有自我污染意识。
我添加了Maven插件:
<build>
<plugins>
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<executions>
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
而且我看到我的实体得到了增强:
@Entity
public class EnhancedOrderLine
implements ManagedEntity, PersistentAttributeInterceptable, SelfDirtinessTracker
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private Long number;
private String orderedBy;
private Date orderedOn;
@Transient
private transient PersistentAttributeInterceptor $$_hibernate_attributeInterceptor;
@Transient
private transient Set $$_hibernate_tracker;
@Transient
private transient CollectionTracker $$_hibernate_collectionTracker;
@Transient
private transient EntityEntry $$_hibernate_entityEntryHolder;
@Transient
private transient ManagedEntity $$_hibernate_previousManagedEntity;
@Transient
private transient ManagedEntity $$_hibernate_nextManagedEntity;
...
调试时,我正在检查org.hibernate.event.internal.DefaultFlushEntityEventListener#dirtyCheck
方法:
if ( entity instanceof SelfDirtinessTracker ) {
if ( ( (SelfDirtinessTracker) entity ).$$_hibernate_hasDirtyAttributes() ) {
dirtyProperties = persister.resolveAttributeIndexes( ( (SelfDirtinessTracker) entity ).$$_hibernate_getDirtyAttributes() );
}
}
并且$$_hibernate_hasDirtyAttributes()
始终返回 false 。
这是因为$$_hibernate_attributeInterceptor
始终为null,因此在设置任何属性时:
private void $$_hibernate_write_number(Long paramLong)
{
if (($$_hibernate_getInterceptor() == null) || ((this.number == null) || (this.number.equals(paramLong))))
break label39;
$$_hibernate_trackChange("number");
label39: Long localLong = paramLong;
if ($$_hibernate_getInterceptor() != null)
localLong = (Long)$$_hibernate_getInterceptor().writeObject(this, "number", this.number, paramLong);
this.number = localLong;
}
因为$$_hibernate_getInterceptor()
为null,将绕过trackChange,因此字节码增强功能将无法解决脏属性,并且将使用默认的深度比较算法。
我想念什么?如何$$_hibernate_attributeInterceptor
正确设置,以便字节码检测方法可以跟踪脏属性?
Hibernate 5解决了此问题,现在对setter的脏检查如下所示:
public void $$_hibernate_write_title(String paramString)
{
if (!EqualsHelper.areEqual(this.title, paramString)) {
$$_hibernate_trackChange("title");
}
this.title = paramString;
}
public void $$_hibernate_trackChange(String paramString)
{
if (this.$$_hibernate_tracker == null) {
this.$$_hibernate_tracker = new SimpleFieldTracker();
}
this.$$_hibernate_tracker.add(paramString);
}
因此,解决方案是对Hibernate 5的升级。
问题内容: 我正在使用Hibernate 4.3.6,并且使用了最新的Maven字节码增强功能来检测所有实体是否具有自我污染意识。 我添加了Maven插件: 而且我看到我的实体得到了增强: 调试时,我正在检查方法: 并且始终返回 false 。 这是因为始终为null,因此在设置任何属性时: 由于为null,将绕过trackChange,因此字节码增强功能将无法解析脏属性,并且将使用默认的深度比较
我使用下面的链接作为参考来实现从PostgreSQL DB懒惰加载图像: URL 在我的用户实体中,我声明字节数组字段: 在pom.xml文件我包括hiberante增强插件: 问题是,当我从数据库中获取用户实体时,也会加载化身字节数组,这是我不想要的。 我知道hibernate enhance maven插件应该增强/改变用户。类文件,这没有发生。 我错过什么了吗? 更新: 我执行增强目标: 组
问题内容: 我正在使用Hibernate 4.2并构建时间字节码工具来解决出现在关系上的懒惰问题和(https://developer.jboss.org/wiki/SomeExplanationsOnLazyLoadingone- to-one ) 您知道之间有什么区别吗? Hibernate字节码检测工具:http : //docs.jboss.org/hibernate/orm/4.3/ma
我正在尝试将字节码增强功能添加到基于Java的Hibernate应用程序中。Hibernate是版本5.2.6.final,它内置在maven中,所以我使用的是hibernate-enhance-maven-plugin。我已经测试了以下直到5.2.18.final的问题,但结果是相同的。 “enableAssociationManagement”选项给了我几个问题,应用程序无法增强。我的问题是,
是否有可能使用JPA接口(实体图)急切地加载@*ToOne属性,这些接口使用父实体类中的@LazyToOne、@LazyGroup设置为懒惰,并启用了字节码增强?我正试图急切地使用实体图加载此类属性,但当查询父实体时,它会触发对此类@*ToOne属性的另一个查询。 试图用另一种方法覆盖实体类中的静态获取类型,包括@LazyToOne,它添加了字节码增强功能。 使用Spring 5.1.3、Spri
我有下面的输入类,当我在输入中触发没有'interactionId'参数的api时,我期望验证错误消息"interactionId不能为空",但是验证通过,我想可能是由于interactionId的默认值为0。 能找个人吗。当输入中没有给出“long”参数时,是否帮助对其强制执行此验证? 使用@NOTURTTY作为客户ID参数,它可以按预期工作。使用@NOTURTY作为长参数"interactio