java - Hibernate使用数据库触发器填充主键

标签 java hibernate jpa oracle10g jpa-2.0

我正在使用 Hibernate 4.1.0.Final 和 Spring 3

我在实体类中有以下内容

@Id
@Column(name = "PROJECT_NO")
@GeneratedValue(strategy=GenerationType.TABLE)
private String projectNumber;

是否可以使用数据库触发器来填充表的主键?或者我必须为此使用 CustomGenerator?

当我尝试上述方法时,出现以下异常

org.hibernate.id.IdentifierGenerationException: Unknown integral data type
for ids : java.lang.String

数据库触发器没有任何序列,它正在使用

SELECT NVL (MAX (project_no), 0) + 1 FROM projects

编辑1

@GeneratedValue(generator="trig")
@GenericGenerator(name="trig", strategy="select", 
parameters=@Parameter(name="key", value="projectNo"))

上面抛出了以下异常

Hibernate: select PROJECT_NO from PROJECTS where PROJECT_NO =?

java.lang.NullPointerException
exception in save null
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValue(AbstractEntityTuplizer.java:645)
    at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:4268)
    at org.hibernate.id.SelectGenerator$SelectGeneratorDelegate.bindParameters(SelectGenerator.java:138)
    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:84)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2764)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3275)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)

最佳答案

问题是您使用的是字符串而不是数值。使用 Long 而不是 String,错误就会消失。

据我所知,您不能使用触发器来填充 ID。事实上,Hibernate 必须检索生成的 ID,但由于它没有 ID,所以我不知道它如何读回刚刚插入的行(先有鸡还是先有蛋的问题)。

您可以在插入行之前使用 SQL 查询来获取 ID,但这种策略效率低下,并且在并发插入的情况下存在重复 ID 的风险。所以我不会使用这个策略。您用 Oracle 标记了您的帖子。我建议你使用一个序列。这就是他们的目的。

关于java - Hibernate使用数据库触发器填充主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15116803/

相关文章:

java - Hibernate Criteria Query ...添加新条件

java - 如何在 Hibernate 5 中使用泛型类型参数?

java - 方言 SQLite 3 与 Hibernate 5 的问题

java - Hibernate CreateNativeQuery 返回空列表

Java程序故障

Java 数组拒绝大值

java - ANDROID - RadioButton Switch 或 IF 如何使用?

java - 保存父实体并从集合中删除子实体时处理 EntityNotFoundException

spring - Spring Data JPA 中的订单按日期描述限制

java - 我可以将属性注入(inject) JPA 实体监听器吗