使用日期时,Hibernate @Version字段错误

时间:2019-01-28 11:24:05

标签: hibernate optimistic-concurrency

我正在查看休眠状态下@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);
}

因此,该版本可以使用很长时间,但现在无法更新。实际上,它不会尝试更新。因此,第一轮测试Puts

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 :(得分:0)

我不认为Hibernate支持日期作为增量版本字段,即使这样做,您也将版本控制链接到某个东西(一个增量值)到某个东西,这些东西的“含义”的增量不遵循该模式。 因此,作为最佳实践,我将版本保留较长的时间,并使用其他字段(例如“最新更新”)保留更改的最后日期。