我使用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")
。
我该怎么办?
答案 0 :(得分:1)
由于@GeneratedValue
只能与@Id
一起使用(汤姆先前回答)
提供值的生成策略的规范 主键。 GeneratedValue注释可以应用于a 实体的主键属性或字段或映射的超类 与Id注释相结合。
<强>解决方案强>
您可以通过以下查询获取最大值:它会返回最大使用端口
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)
您可以使用:
不是JPA,但我认为JPA / Hibernate可以自动完成