У меня есть код, и я использую envers, и он отлично работает. Я получаю аудит в отдельной таблице _AUD. Но позже мне нужно использовать оптимистичную блокировку. Но это не работает с аннотацией @Audited
. Вот мой кодHibernate @Audited conflict @Version
@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);
}
Код должен поднять ошибку блокировки с оптимизацией, но это не так. Вместо этого я получаю
Caused by: java.sql.SQLException: Field 'Version' doesn't have a default value.
Но когда я удалить @Audited
аннотацию, оптимистические работы и я получаю HibernateOptimisticLockingFailureException
который я ожидал. Известно ли, что эти 2 аннотации не очень хорошо сочетаются друг с другом? Я также попытался положить @NotAudited
на колонке версии, но до сих пор не работают