2010-05-12 68 views
11

我想实现一些使用Hibernate/JPA的基本实体。最初,代码部署在MySQL上,工作正常。现在,我将它移植到使用PostgreSQL。在MySQL中,我的实体类定义它的主键下面的语法自动递增的长值:Hibernate/JPA和PostgreSQL - 主键?

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

然而,我发现,我与PostgreSQL的错误,当我试图插入在许多纪录时间。为了在PostgreSQL中获得与我在MySQL中一样的自动递增行为,我需要用什么注释我的主键?感谢您的任何帮助,您可以提供!

+1

GenerationType.AUTO不应该对任何数据库造成问题。你能发布异常和/或你的插入代码吗?值得注意的是,在MySQL上,GenerationType.AUTO转换为增量类型,而在PostgreSQL上,它默认使用序列。有关说明,请参阅文档http://docs.jboss.org/hibernate/core/3.5/reference/en/html/mapping.html#mapping-declaration-id – ig0774 2010-05-13 00:34:13

+0

我会再试一次,然后发布我得到的异常。我有我的实体类设置的方式是有一个抽象的基类与定义的id和@MappedSuperclass注解,然后从那里派生我的其他实体。你认为这会在PostgreSQL中造成问题吗? – Shadowman 2010-05-13 13:10:40

+0

你用JPA'persist()'和'merge()'或直接SQL插入吗? 'GenerationType.AUTO'的意思是“持久性提供者应该选择合适的策略”(JPA 2.0 Final Release,11.1.17节)。它并不一定意味着序列关系。只有'GenerationType.SEQUENCE'强制JPA提供者使用序列。这个问题目前太模糊了,但可能Hibernate决定使用Postgres下的表生成'id',也许你正在运行SQL,希望列id不存在缺省序列值。请显示Postgres关系(psql的'\ d')。 – 2010-05-13 17:15:14

回答

10

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

@MappedSuperclass 
public abstract class AbstractDomainEntity implements Serializable { 

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

     ... 
} 

...然后我扩展了这个在我的每个剩余的实体。因为我已经将这个属性放入实体本身,并将@GenerationType配置为SEQUENCE。例如:

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声明为序列,也没有创建。感谢您在这件事上的所有帮助和建议!

+0

有时候需要将名称转义并加上引号:name =“\”profile_seq \“” – 2012-10-03 15:44:04

17

GenerationType.IDENTITY

+0

这就是诀窍!谢谢。 – 2010-06-02 12:53:03

+0

什么传说!这对我的@MappedSuperclass工作:) – 2013-04-06 22:19:21

+0

比接受的更好。虽然这可能有效,但这不需要自定义生成器定义。谢谢! – nerdwaller 2015-11-24 17:44:03