Hibernate @Version Field error при использовании Date - PullRequest
0 голосов
/ 28 января 2019

Я смотрю на готовые опции (число / дата) для @Version в спящем режиме.У меня есть число, работающее так, как я и ожидал - устанавливает версию равной 0 при начальной вставке, автоматически увеличивается при обновлении, не увеличивает и не мешает обновлению без изменений.Я хотел посмотреть на использование Date и существенно изменил мой пример рабочего кода с Long на Date.Это не работает, и мне было интересно, если кто-нибудь может мне помочь?

Я использую 5.3.6.Final (с Spring)

У меня есть эта сущность

@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 Ответ

0 голосов
/ 28 января 2019

Я не думаю, что Hibernate поддерживает дату как поле инкрементной версии, и даже если это происходит, вы связываете версионирование с чем-то (инкрементным значением) с чем-то, чей «смысл» приращения не следует этому шаблону.Поэтому в качестве лучшей практики я бы сохранял версию как длинную и использовал другое поле, например «последнее обновление», чтобы сохранить дату последнего изменения.

...