【问题标题】:Hibernate @Version Field error when using Date使用日期时出现休眠 @Version 字段错误
【发布时间】:2019-01-28 11:24:05
【问题描述】:

我正在查看休眠中@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 并工作时,它是先选择然后更新?现在它直接插入并失败。 我看到的所有官方和非官方帮助都暗示这应该开箱即用?有什么明显的我做错了吗?

【问题讨论】:

    标签: hibernate optimistic-concurrency


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      相关资源
      最近更新 更多