Hibernate/JPA和PostgreSQL-主键?

Hibernate/JPA和PostgreSQL-主键?,hibernate,jpa,postgresql,primary-key,Hibernate,Jpa,Postgresql,Primary Key,我正在尝试使用Hibernate/JPA实现一些基本实体。最初,代码部署在MySQL上,运行良好。现在,我将它移植到PostgreSQL上。在MySQL中,my entity类使用以下语法将其主键定义为自动递增的长值: @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; 然而,我发现当我尝试一次插入大量记录时,PostgreSQL会出错。我需要用什么注释主键才能在PostgreSQL中

我正在尝试使用Hibernate/JPA实现一些基本实体。最初,代码部署在MySQL上,运行良好。现在,我将它移植到PostgreSQL上。在MySQL中,my entity类使用以下语法将其主键定义为自动递增的长值:

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

然而,我发现当我尝试一次插入大量记录时,PostgreSQL会出错。我需要用什么注释主键才能在PostgreSQL中获得与MySQL相同的自动递增行为?谢谢你能提供的任何帮助

GenerationType.IDENTITY

我已经解决了这个问题。以前,在我的MySQL实现中,我使用了一个具有以下签名的抽象基类:

@MappedSuperclass
public abstract class AbstractDomainEntity implements Serializable {

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

        ...
}
…然后我把它扩展到我剩下的每一个实体中。此后,我将该属性下推到实体本身中,并将@GenerationType配置为序列。例如:

public class UserProfileBean extends AbstractIdentifiedDomainEntitiy {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "profile_seq")
    @SequenceGenerator(name = "profile_seq", sequenceName = "profile_seq")
    private Long id = null;

        ...
}

通过这样做,可以在Hibernate/JPA和PostgreSQL中生成并使用正确的序列。以前,即使我将GenerationType声明为Sequence,也没有创建一个。谢谢你在这件事上的帮助和建议

GenerationType.AUTO不应导致任何数据库出现问题。您可以发布例外情况和/或插入代码吗?值得注意的是,在MySQL上,GenerationType.AUTO会转换为增量类型,而在PostgreSQL上,它默认使用序列。请参阅此处的文档了解描述。我将再试一次,然后发布我收到的异常。我设置实体类的方法是定义id和@MappedSuperclass注释的抽象基类,然后从中派生其余实体。您认为这会在PostgreSQL中产生问题吗?您是使用JPA
persist()
merge()
插入还是直接SQL插入
GenerationType.AUTO
表示“持久性提供者应该选择适当的策略”(JPA2.0最终版本,第11.1.17节)。它不一定意味着序列关系。只有
GenerationType.SEQUENCE
强制JPA提供者使用序列。这个问题目前过于模糊,无法确定,但可能Hibernate决定在Postgres下使用一个表生成
id
,或者您运行SQL时希望列
id
不存在默认序列值。请显示Postgres关系(psql的
\d
)。我正在使用for循环生成100个测试行。我创建每个实体并设置id(主键)以外的所有值,然后执行JPA persist()来存储它。我会增加日志级别,并获得更多信息发布。谢谢有时需要转义名称并加上引号,例如:name=“\”profile\u seq\”,这比接受的名称要好得多。虽然这种方法可能有效,但不需要自定义生成器定义。谢谢