我正在查看休眠状态下@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并工作时,它先进行选择,然后进行更新?现在,它可以直接插入并失败。 我所见过的所有帮助,包括官方和非官方的暗示,这都应该开箱即用吗?我做错了什么明显的东西吗?
答案 0 :(得分:0)
我不认为Hibernate支持日期作为增量版本字段,即使这样做,您也将版本控制链接到某个东西(一个增量值)到某个东西,这些东西的“含义”的增量不遵循该模式。 因此,作为最佳实践,我将版本保留较长的时间,并使用其他字段(例如“最新更新”)保留更改的最后日期。