我应该与休眠和已经存在的表一起使用哪个GenerationType

时间:2019-01-07 03:48:38

标签: postgresql hibernate jpa playframework

我遇到一个问题,其中@GeneratedValue(strategy=GenerationType.AUTO)无法正常工作。我有一个错误,说kcyn.hibernate_sequence不存在。

我阅读了以下主题:hibernate could not get next sequence value。它说我应该将AUTO更改为IDENTITY。但是然后,我出现一个错误,说在主键中添加了一个NULL值。

如果我从一个不存在的表开始,采用AUTO策略,那么休眠会自动用一个airroute表创建一个hibernate_sequence表。

但是,由于我想使用现有数据库,所以我的问题是,应该使用哪个GenerationType才能自动生成我的ID?

package models;
import javax.persistence.*;    
@Entity
public class Airroute {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long id;    
    public String label;        
    public String spokenname;        
    public Boolean internal;        
    public String descr;        
    public String direction;
}

已更新

Maxsim=# \d+ "KCYN-GOLD-USMC_3_141_553".airroute
                    Table "KCYN-GOLD-USMC_3_141_553.airroute"
   Column   |      Type      | Modifiers | Storage  | Stats target | Description
------------+----------------+-----------+----------+--------------+-------------
 id         | numeric(11,0)  | not null  | main     |              |
 label      | character(8)   |           | extended |              |
 spokenname | character(60)  |           | extended |              |
 internal   | boolean        |           | plain    |              |
 descr      | character(250) |           | extended |              |
 direction  | character(1)   |           | extended |              |
Indexes:
    "airroute_pkey" PRIMARY KEY, btree (id)

1 个答案:

答案 0 :(得分:0)

任何JPA文档都会告诉您,

  • git commit -m "ACD-1664 | <cursor>"意味着让JPA提供者做任何喜欢的事情(这样一来您可能就无法得到想要的东西)
  • AUTO将在RDBMS中使用SEQUENCE(Postgresql支持该序列,因此您可以选择这种情况)
  • SEQUENCE将在数据库中创建一个表以保存id值(也是您的情况的一种选择)
  • TABLE将要求您没有在该列上使用的列类型IDENTITY不是选项)。

对于SERIALSEQUENCE,JPA提供者将需要能够在该模式中分别创建SEQUENCE或TABLE(并进行配置)