加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么JPA不会自动为我的行生成一个id?

发布时间:2020-12-15 08:46:27 所属栏目:Java 来源:网络整理
导读:我想使用SEQUENCE策略自动生成id,但我正在打破我的头脑才能使它工作.我根本不知道为什么我不能让它发生. 这就是我做的. 首先,我有一个实体: @Entity@SequenceGenerator(name="VlasnikSeq",sequenceName="VLA_SEQ")public class Vlasnik implements Serializ
我想使用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>

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

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

[EL Warning]: Exception [EclipseLink-4002] (Eclipse Persistence
Services – 2.3.0.v20110604-r9504):
org.eclipse.persistence.exceptions.DatabaseException Internal
Exception: java.sql.SQLSyntaxErrorException: SEQUENCE ‘VLA_SEQ’ does
not exist.

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

org.apache.derby.client.am.SqlException: SEQUENCE ‘VLA_SEQ’ does not

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

CREATE SEQUENCE VLA_SEQ;

但我收到以下消息:

Sequence ‘VLA_SEQ’ already exists.

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

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

解决方法

要使用 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;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读