【发布时间】: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