Hibernate @Version Field error при использовании Date
Я смотрю на готовые параметры (число / дата) для @Version в спящем режиме. У меня есть число, работающее так, как я и ожидал - устанавливает версию равной 0 при начальной вставке, автоматически увеличивается при обновлении, не увеличивает и не мешает обновлению без изменений. Я хотел посмотреть на использование Date и существенно изменил мой пример рабочего кода с Long на Date. Это не работает, и мне было интересно, если кто-нибудь может мне помочь?
Я использую 5.3.6. Наконец (с весны)
У меня есть эта сущность
@Entity
@Table (name="Names")
public class Names implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private Date version;
@Id
@Column(name="id", nullable=false)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id= id;
}
@Column(name="NAME", length=100)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Version
public Date getVersion() {
return version;
}
public void setVersion(Date version) {
this.version = version;
}
}
У меня есть этот простой тест
@Test
public void test_1 () {
Names n = new Names ();
//1st record
n.setId(1L);
n.setName(“John Doe”);
System.out.println("SAVE 1 BEFORE ");
nameService.saveRuleOfEngagement(roE);
System.out.println("SAVE 1 AFTER ");
В сервисе нет ничего интересного, я не думаю?
public void saveName(Names n) {
Session currentSession = sessionFactory.getCurrentSession();
currentSession.saveOrUpdate(n);
}
Так что это работало с версией долго, но теперь не удается обновить. На самом деле это не пытается обновить. Итак, первый прогон тестов ставит
1, “John Doe”, 2019-01-28 11:04:55.314
Если я снова запускаю то же самое (с теми же данными или измененным именем), я получаю
SAVE 1 BEFORE
Hibernate:
insert
into
“Names”
(“NAME”, version, “id”)
values
(?, ?, ?)
2019-01-28T11:07:27,008 [main] [WARN] [org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions(129)] - SQL Error: 0, SQLState: 23505
2019-01-28T11:07:27,008 [main] [ERROR] [org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions(131)] - ERROR: duplicate key value violates unique constraint “Names_pkey”
Detail: Key (“id”)=(1) already exists.
Когда он использовал Long и работал, он делал выбор, а затем обновление? Теперь это идет прямо, чтобы вставить и терпит неудачу. Вся помощь, официальная и неофициальная, которую я видел, подразумевает, что это должно работать из коробки? Есть что-то очевидное, что я сделал неправильно?
1 ответ
Я не думаю, что Hibernate поддерживает дату как поле инкрементной версии, и даже если это происходит, вы связываете версионирование с чем-то (инкрементным значением) с чем-то, чей "смысл" приращения не следует этому шаблону. Поэтому в качестве лучшей практики я бы сохранял версию как длинную и использовал другое поле, такое как "последнее обновление", чтобы сохранить дату последнего изменения.