2013-10-15 1 views
0

Привет, у нас есть сервер, работающий с Hibernate, классы проверяются с помощью Envers. Как это:Java Hibernate Envers UpdateLockingStrategy warning HHH000416 On AuditTable

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-Options для подавления этих предупреждений. Предупреждения для нас неактуальны, потому что один раз пишут запись Audit-entry и никогда не обновляем ее, а 5 предупреждений на класс наводняют наш журнал.

Мы используем hibernate-envers-4.1.10.Final.jar и hibernate-core-4.1.10.Final.jar с java 1.7.

У кого-либо есть такая же проблема или вы знаете, как это исправить. Мы благодарны за любую помощь.

ответ

0

Как мы можем видеть в исходном коде спящего режима:

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():

/** 
* 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(); 

Следствием этого является то, если вы хотите использовать аудиторскую организацию и не дайте это предупреждение, вы должны включить оптимистичную блокировку с помощью @Version в столбце вашего объекта :)

+0

Проблема в том, как это сделать, потому что у нас нет Аудит-объект - только таблица. Объект генерируется Hibernate.Envers при запуске. –

Смежные вопросы