如何在EclipseLink + PostgreSQL中为GenerationType.AUTO id字段创建列+序列?

时间:2015-08-03 14:54:54

标签: postgresql persistence eclipselink

我正在使用EclipseLink 2.5.2。我有这个抽象实体包含生成的id:

@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;

我希望我的应用程序创建或扩展我的(PostgreSQL 9.3.7)数据库,所以我在我的persistence.xml中使用这些属性:

<properties>
  <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
  <property name="eclipselink.ddl-generation.output-mode" value="both"/>
</properties>

运行应用程序后,会创建表,但是我无法使用纯SQL插入数据而无需在插入查询中显式设置id。因此,生成的值策略不会反映在数据库模型中。

它是这样创建的:

id bigint NOT NULL

但我预计它会像:

id bigint NOT NULL DEFAULT nextval('some_generated_sequence'::regclass)

当我连接到Derby数据库时,自动生成的id 工作(生成序列)。

如何使用PostgreSQL数据库配置EclipseLink以正确生成GenerationType.AUTO id字段的数据库列和序列?

我还尝试定义一个序列并在我的id字段中使用它:

@MappedSuperclass
@SequenceGenerator(name="global_sequence", sequenceName="global_sequence", allocationSize=1, initialValue=1)
public abstract class AbstractEntity implements Serializable
{
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "global_sequence")
  @Column(nullable = false)
  private Long id;

  ...
}

当我运行我的应用程序时,我收到此错误:

  

内部异常:org.postgresql.util.PSQLException:错误:关系“global_sequence”不存在

1 个答案:

答案 0 :(得分:1)

generationtype.auto允许提供程序选择使用的序列类型,在这种情况下,EclipseLink可能会选择使用允许预分配的序列表。如果您希望使用特定类型的序列生成,则应指定数据库支持的序列生成,但要注意权衡,因为标识类型排序需要在insert语句之后获取值,这可能会限制性能选项的使用,例如批量插入和预分配。