gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:32:26 24 4
gpt4 key购买 nike

我想使用 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 功能为实体生成表时,我得到了这个:

enter image description here

如您所见,表已创建,但没有 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.

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

这是我第一次使用 glassfish 3.1,在我不记得的版本 3.0 中,有这个问题,我什至可以只使用 @GenneratedValue。非常感谢您的帮助。

最佳答案

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

可用策略由GenerationType定义:

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

最常见的使用方法是指定 SEQUENCEIDENTITY

  • 对于使用 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;
  • 对于不使用序列而使用标识列的数据库,例如 Microsoft SQL Server,您需要将IDENTITY 指定为策略:

    公开课 MyClass {

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

关于java - 为什么 JPA 不自动为我的行生成一个 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com