【问题标题】:@GeneratedValue in Oracle with no SequenceOracle 中的 @GeneratedValue 没有序列
【发布时间】:2014-07-02 08:51:22
【问题描述】:

我创建了一个触发器,以便每次将实体 ID 插入到我的 Oracle 数据库中时,它们都会自动生成一个序列。

问题在于为 Hibernate/JPA 注释这些实体:我需要定义一个 @GeneratedValue 注释,但我不想指定序列名称——这样做会使 Hibernate 先查询序列,然后插入,这是触发器已经完成的工作。

在我提出的场景中,有什么方法可以跳过@GeneratedValue 中的这个序列?

如果没有提供 id,我会得到异常:

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): Pattern

模式类:

@Entity
@Table(name = "PATTERN")
public class Patron extends HistoricoAbstractEntity {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID_PATTERN")
    private Integer idPattern;

    @Column
    private String description;

    @Column(name = "NEGATIVE")
    private Boolean isNegative;

    @Column(name = "type")
    private Integer type;

    @Column(name = "N_DAYS")
    private Integer numDays;
        ... (getters & setters)

    }

【问题讨论】:

  • 如果您已经在使用您的实现生成 id,请告诉您使用 @GeneratedValue 的需要是什么。
  • 如果我不指定 id,Hibernate 会告诉我不能使用 save 方法。
  • 你需要指定一个id但是没有必要使用@GeneratedValue,如果你不在你的实体中指定@Id就使用@Id然后hibernate会报错。
  • 我使用了@Id 注解,但如果我没有为实体提供标识符,Hibernate 会抱怨。
  • 你能发布投诉信息和你的实体类吗?

标签: java oracle hibernate jpa


【解决方案1】:

根据您的代码, 我可以告诉你的是它与@GeneratedValue 无关,它指定休眠负责为您的实体生成和标识符。在您的情况下,您正在生成自己的 id,因此您必须手动设置该特定实体的 id。然后您将不再收到此错误,您可以尝试的另一件事是使用 @PrePersist 使用此注释方法并尝试为其中的 id 分配一个值。我还没有尝试过,但这应该可以根据这个答案在 SO 上工作。

Assign Custom Identifier

如果您的 id 是由数据库生成的,那么您应该在您的 id 字段上使用 @GeneratedValue(strategy=GenerationType.AUTO) 以及您的 @Id 注释。

【讨论】:

  • 我无法分配 ID,这是一个新身份。 id 分配是在数据库本身中完成的,所以在对象被持久化之前我无法知道 id。
猜你喜欢
  • 2011-03-05
  • 2013-02-07
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2020-06-27
相关资源
最近更新 更多