2012-10-18 89 views
0

使用Open JPA 2.0,数据库是DB2 9.7。我想创建一个实体,其中包括作为主键的ID和自动生成的标识列,创建实体后需要显示生成的ID。对于这个持久化实体后,我打电话给entity.getId()。 在数据库中,我看到下面的查询得到执行创建实体并返回ID

select ID from final table 
    (INSERT INTO WEB.USER (NAME, LOCATION) VALUES (?, ?)) 

是否有任何替代/更好的方法来创建一个实体,并返回生成的ID?我希望避免"Select ID from final table",因为这可能会对性能产生影响。

+1

你可以试试@TableGenerator。 –

回答

0

我正在使用数据库序列(@SequenceGenerator)以避免“从最终表中选择ID”。这工作正常,并@TableGenerator也将排序此问题。

0

这是您从DB2检索自动生成的ID的方式,您无法对此做任何事情。其他数据库通常需要额外的SQL查询,所以对于DB2来说,它甚至更好,因为它会立即返回ID。我不认为有这样的更快的方法。

检出OPENJPA-736实施此优化的位置。

+0

感谢您的回复。但是我的DBA对此并不满意。如果我将Identity列更改为生成的序列会有帮助吗?最后一个选项是用这个问题的直接JDBC执行替换JPA。 –

+0

看来你DBA是面向Oracle的。 DB2以这种方式更好,因为它为唯一ID提供了序列和自动生成列。你的DBA不满意的标准是什么?他分析了这个查询的访问计划吗?你为什么要一个序列?这最后意味着两次访问数据库,这增加了IO和可能的网络流量。使用其他选项(自动生成),它只是在数据库中传输和处理的一个包。 – AngocA