我使用Oracle XE 10g,Hibernate 3.5,JPA 2.0进行安装。有一个带有主键的简单表,由插入时的数据库触发器生成。触发器从序列中获取值。触发器/序列构造由Oracle XE完成。如果通过触发器生成值,我如何注释Id列?
实际的问题是:如何在EntityManager.persist之后获得当前在我的实体中的Id值?
我尝试:
@Id
private long id;
- > id为0
;
@Id
@Generated(GenerationTime.ALWAYS)
@Column(insertable = false, updatable = false)
private long id;
- > id是0
;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
- >失败,因为Hibernate试图直接查询一个序列(不存在)。
ID在前两种方法中在数据库中生成,但我没有在我的对象中的值。
谢谢,但是:触发器是Oracle自动生成递增PK值的方法。如果我摆脱了这一点,我将失去通过对数据库的直接查询轻松插入行的可能性。第二,如果我在你的建议中注释,我不能轻易地转换到德比进行单元测试:(...我需要的是一个注释,它说:“只要拿出数据库产生的东西。” – Zeemee
谷歌搜索这一点,和基于粗略的检查,似乎其他用户已经成功地从Hibernate中重新获得了Oracle序列,下面是一个例子:https://forum.hibernate.org/viewtopic.php?p=2442821。在Derby的问题上,unit针对不同于部署平台的数据库平台进行测试并不是最佳实践,可能会导致单元测试和运行时行为之间的不一致。 – atrain
@Mulmoth:除非有另一个字段唯一标识行,否则Hibernate如何获得因为识别刚刚插入的行的唯一方法就是它的ID,它不知道,简而言之,需要ID来获得ID,你的触发器是一个非常糟糕的想法。 –