审核表上的Java Hibernate Envers更新跟踪策略警告HH000416
大家好,我们有一个运行Hibernate的服务器,这些类是用envers审计的。 像这样:审核表上的Java Hibernate Envers更新跟踪策略警告HH000416,java,hibernate,locking,hibernate-envers,audit-tables,Java,Hibernate,Locking,Hibernate Envers,Audit Tables,大家好,我们有一个运行Hibernate的服务器,这些类是用envers审计的。 像这样: package db.shared; import interfaces.GuiEditableTable; import interfaces.ListableEntity; import interfaces.ShortDescriptable; import java.util.HashSet; import java.util.Set; import javax.persistence.Co
package db.shared;
import interfaces.GuiEditableTable;
import interfaces.ListableEntity;
import interfaces.ShortDescriptable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.persistence.Version;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.envers.AuditTable;
import org.hibernate.envers.Audited;
import common.Identifiable;
import common.Preferences;
import common.entity.EntityConcurrency;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Audited
@AuditTable(schema=Preferences.SCHEMA_AUDIT, value=Lizenz.CLASS_NAME+Preferences.AUDIT_SUFFIX)
@Table(schema = Preferences.SCHEMA_SHARED, uniqueConstraints = { @UniqueConstraint(columnNames = { Lizenz.PROPERTY_LIZENZ_NAME }), @UniqueConstraint(columnNames = { Lizenz.PROPERTY_LIZENZ_NUMBER }) })
public class Lizenz extends common.entity.AbstractEntity
implements EntityConcurrency, ListableEntity, ShortDescriptable, GuiEditableTable
{
private static final long serialVersionUID = 589201271279697573L;
public static final String CLASS_NAME = "Lizenz";
public static final String PROPERTY_LIZENZ_NAME = "lizenzName";
public static final String PROPERTY_LIZENZ_NUMBER = "lizenzNummer";
public static final String MTM_PROPERTY_NAME = "lizenz";
public static final int LIZENZ_NUMBER_PADDING = 4;
@Id
@Column(name = Identifiable.PROPERTY_ID, columnDefinition = Preferences.DDL_TYPE_ID)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long ID;
@Version @Column(name = EntityConcurrency.PROPERTY_VERSION)
private long version;
private String lizenzName;
private String logo;
.
.
.
}
在serverstart上有如下警告:
15:14:49 WARN [org.hibernate.dialect.lock.UpdateLockingStrategy] HHH000416: Write locks via update not supported for non-versioned entities [db.shared.Lizenz_AUD]
15:14:49 WARN [org.hibernate.dialect.lock.UpdateLockingStrategy] HHH000416: Write locks via update not supported for non-versioned entities [db.shared.Lizenz_AUD]
15:14:49 WARN [org.hibernate.dialect.lock.UpdateLockingStrategy] HHH000416: Write locks via update not supported for non-versioned entities [db.shared.Lizenz_AUD]
15:14:49 WARN [org.hibernate.dialect.lock.PessimisticReadUpdateLockingStrategy] HHH000416: Write locks via update not supported for non-versioned entities [db.shared.Lizenz_AUD]
15:14:49 WARN [org.hibernate.dialect.lock.PessimisticWriteUpdateLockingStrategy] HHH000416: Write locks via update not supported for non-versioned entities [db.shared.Lizenz_AUD]
问题是我们只为审计创建了DB表,没有任何审计类。这些类将在启动时生成,我们还没有找到任何@audit选项来抑制这些警告。这些警告与我们无关,因为只写一次审核条目,从不更新,每个类有5个警告充斥着我们的日志
我们在Java1.7中使用hibernate-envers-4.1.10.Final.jar和hibernate-core-4.1.10.Final.jar
是否有人有相同的问题或知道如何解决。
我们非常感谢您的帮助。我们可以在hibernate的源代码中看到:
public UpdateLockingStrategy(Lockable lockable, LockMode lockMode) {
this.lockable = lockable;
this.lockMode = lockMode;
if (lockMode.lessThan(LockMode.UPGRADE)) {
throw new HibernateException("[" + lockMode + "] not valid for update statement");
}
if (!lockable.isVersioned()) {
log.warn("write locks via update not supported for non-versioned entities [" + lockable.getEntityName() + "]");
this.sql = null;
} else {
this.sql = generateLockString();
}
}
以及isVersioned()的文档:
/**
*确定是否为此启用按列的乐观锁定
*实体。
*
*@如果按列进行乐观锁定(即,或
*)已启用;否则就错了。
*/
公共布尔值已版本化();
其结果是,如果您想使用审计实体,而不发出此警告,您应该在实体的列上启用@Version乐观锁定(:)问题是如何做到这一点,因为我们没有审计对象,只有表。该对象由Hibernate.Envers在启动时生成。
/**
* Determine whether optimistic locking by column is enabled for this
* entity.
*
* @return True if optimistic locking by column (i.e., <version/> or
* <timestamp/>) is enabled; false otherwise.
*/
public boolean isVersioned();