我正在使用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”不存在
答案 0 :(得分:1)
generationtype.auto允许提供程序选择使用的序列类型,在这种情况下,EclipseLink可能会选择使用允许预分配的序列表。如果您希望使用特定类型的序列生成,则应指定数据库支持的序列生成,但要注意权衡,因为标识类型排序需要在insert语句之后获取值,这可能会限制性能选项的使用,例如批量插入和预分配。