我正在尝试使用Hibernate / JPA实现一些基本实体。最初代码部署在MySQL上并且工作正常。现在,我将它移植到使用PostgreSQL。在MySQL中,我的实体类使用以下语法将其主键定义为自动递增的long值:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
但是,当我尝试一次插入大量记录时,我发现PostgreSQL出现错误。为了在PostgreSQL中获得与MySQL相同的自动递增行为,我需要注释我的主键是什么?感谢您提供的任何帮助!
答案 0 :(得分:18)
GenerationType.IDENTITY
答案 1 :(得分: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声明为Sequence,也没有创建。感谢您对此事的所有帮助和建议!