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

sfr*_*frj 3 java orm jpa java-ee 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;
    //...
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

[EL警告]:异常[EclipseLink-4002](Eclipse Persistence Services - 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;
Run Code Online (Sandbox Code Playgroud)

但我收到以下消息:

序列'VLA_SEQ'已经存在.

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

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

Alf*_*rio 7

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

可用策略由GenerationType定义:

public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };
Run Code Online (Sandbox Code Playgroud)

最常用的方法是指定SEQUENCEIDENTITY.

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

    公共类MyClass {

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

    }

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

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

    公共类MyClass {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)  
    private Long id;
    
    Run Code Online (Sandbox Code Playgroud)

    }