hibernate没有得到序列的next_val

时间:2015-10-31 05:09:18

标签: java hibernate postgresql

我使用postgresql数据库。

我在一个表中有一个串行字段,串行字段不是主键,它用于分配端口号以避免重复,串行例如从30001开始。

我使用hibernate来插入表,但字段始终为0。

我的序列描述:

<suite name="Default suite" thread-count="2" parallel="tests">
<test name="Nexus">
<Parameters>
<parameter name="platform" value="Nexus"/>
<parameter name="browsername" value="Android"/>
 <parameter name="udid"  value="xyz" />
<parameter name="remoteurl" value="http://0.0.0.0:4723/wd/hub"/>
</Parameters>
<classes>
<class name="AppiumTest">
<methods>
<include name="Test1"/>
<include name="Test2"/>
<include name="Test3"/>
</methods>
</class>
</classes>
</test>
<test name="Moto E">
<Parameters>
<parameter name="platform" value="Moto E"/>
<parameter name="browsername" value="Android"/>
<parameter name="udid"  value="abc" />
<parameter name="remoteurl" value="http://0.0.0.0:4726/wd/hub"/>
</Parameters>
<classes>
<class name="AppiumTest">
<methods>
<include name="Test1"/>
<include name="Test2"/>
<include name="Test3"/>
</methods>
</class>
</classes></suite>

我的实体java代码是:

last_value    | bigint  | 30001

start_value   | bigint  | 30001

increment_by  | bigint  | 1

max_value     | bigint  | 9223372036854775807

min_value     | bigint  | 30001

由于该字段不是主键,因此我不使用@Basic @Column(name = "XXX") @SequenceGenerator(name="XXX_seq",sequenceName="XXX_seq", allocationSize=1, initialValue = 30001) @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="XXX_seq")

我该怎么办?

2 个答案:

答案 0 :(得分:1)

由于@GeneratedValue只能与@Id一起使用(汤姆先前回答)

  

提供值的生成策略的规范   主键。 GeneratedValue注释可以应用于a   实体的主键属性或字段或映射的超类   与Id注释相结合。

DOC

<强>解决方案

您可以通过以下查询获取最大值:它会返回最大使用端口

Query query = em.createQuery("select max(u.portId) from XXXX u");
List<Long> list = query.getResultList();
return (list.isEmpty() || list.get(0) == null ? maxId : list.get(0));

答案 1 :(得分:0)

@GeneratedValue

仅适用于标识符(@Id)

您可以使用:

  • 插入触发器
  • 一个单独的表,用于存储上次使用的号码
  • 特定于数据库的解决方案(如果我没有弄错的话,Postgres可以在列上有序列)

不是JPA,但我认为JPA / Hibernate可以自动完成