为什么JPA不会自动生成我的行的ID?

时间:2011-12-26 16:44:43

标签: java java-ee jpa orm java-ee-6

我想使用SEQUENCE策略自动生成ID,但是我很想让它工作。我根本不知道为什么我不能实现它。

这就是我的意思。 首先,我有一个实体:

 @Entity
@SequenceGenerator(name="VlasnikSeq", sequenceName="VLA_SEQ")
public class Vlasnik implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="VlasnikSeq")
    private Long id;
    //...
我在persistence.xml中的

映射了它:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="sampleAplication">
    <class>entities.Vlasnik</class>
    <class>entities.Ljubimac</class>
    </persistence-unit>
</persistence>

当我使用日食功能为实体生成表时,我得到了这个:

enter image description here

如您所见,表格已创建,但没有SEQUENCE表格。 我还在控制台中注意到以下消息,而JPA正在创建表:

  

[EL警告]:异常[EclipseLink-4002](Eclipse持久性   服务 - 2.3.0.v20110604-r9504):   org.eclipse.persistence.exceptions.DatabaseException内部   例外:java.sql.SQLSyntaxErrorException:SEQUENCE'VLA_SEQ'   不存在。

我认为下一步是尝试运行应用程序,看看我是否可以创建一些行。但是当我试图坚持某些东西时,我得到一个例外:

  

org.apache.derby.client.am.SqlException:SEQUENCE'VLA_SEQ'不

所以我得出结论,由于某种原因我需要那个表,所以我转到数据库管理的角度,我尝试执行以下查询:

CREATE SEQUENCE VLA_SEQ;

但我收到以下消息:

  

序列'VLA_SEQ'已经存在。

我完全糊涂了。我不知道该怎么办。我只想在数据库中创建新行时自动生成实体的ID。

这是我第一次使用glassfish 3.1,在版本3.0中我不记得,有这个问题,我甚至可以使用@GenneratedValue。 我很感激一些帮助。

1 个答案:

答案 0 :(得分:7)

为了使用GeneratedValue,您必须指定策略和生成器。默认情况下,策略为 AUTO ,生成器为空

可用策略由 GenerationType

定义
public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };

最常用的方法是指定 SEQUENCE IDENTITY

  • 对于使用 SEQUENCE 的数据库,例如Oracle和HSQLDB,您还必须使用 SequenceGenerator 注释:

    公共类MyClass {

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

    }

如果您启用了自动DDL,则无需创建序列,因为JPA提供程序将为您执行此操作。如果不是这种情况,你必须像这样手动完成:

CREATE SEQUENCE SEQMYCLASSID;
  • 对于不使用squences并使用Microsoft SQL Server等标识列的数据库,您需要将 IDENTITY 指定为策略:

    公共类MyClass {

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

    }