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

Другие вопросы по тегам