Hibernate @Audited冲突@Version

时间:2015-10-05 00:42:10

标签: java spring hibernate hibernate-envers optimistic-locking

我有一个代码,我使用envers,它工作得很好。我在一个单独的_AUD表上进行审计。但后来,我需要使用乐观锁定。但它不适用于@Audited注释。这是我的代码

@MappedSuperclass
@Audited
public class BaseVO implements IXtrainVO
{
    @Version
    @Column(name = "Version")
    private long version;
}

@Entity
@Table(name = "Person")
@Audited
public class PersonVO extends BaseVO
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "PersonId", unique = true, nullable = false)
    private Long personId;

    @Column(name = "Name", length = 80, nullable = false)
    @NotBlank
    @Size(max = 80)
    private String name;
}


@Test
public void testLocking() throws Exception
{
    PersonVO person = new PersonVO();
    person.setName( "John" );
    Long personId = personManager.savePerson( person );
    PersonVO copy1 = personManager.findPerson( personId );
    PersonVO copy2 = personManager.findPerson( personId );
    copy1.setName( "John1" );
    personManager.updatePerson( copy1 );
    copy2.setName( "John2" );
    personManager.updatePerson( copy2 );
}

代码应该引发optimistict锁定错误,但事实并非如此。相反,我得到

Caused by: java.sql.SQLException: Field 'Version' doesn't have a default value.

但是当我删除@Audited注释时,乐观就行了,我得到HibernateOptimisticLockingFailureException这是我期待的。是否知道这两个注释不能很好地相互配合?我还尝试将@NotAudited放在版本列上,但仍然无法正常工作

1 个答案:

答案 0 :(得分:0)

我能够使用Java - JPA - @Version annotation

中的讨论来解决

我需要在db级别上有一个默认值。在插入时,没有默认值。但是,随后的更新将会增加并检查乐观锁定