Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate使用数据库触发器填充主键_Java_Hibernate_Jpa_Oracle10g_Jpa 2.0 - Fatal编程技术网

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

Java Hibernate使用数据库触发器填充主键,java,hibernate,jpa,oracle10g,jpa-2.0,Java,Hibernate,Jpa,Oracle10g,Jpa 2.0,我正在使用Hibernate4.1.0.Final和Spring3 我在实体类中有以下内容 @Id @Column(name = "PROJECT_NO") @GeneratedValue(strategy=GenerationType.TABLE) private String projectNumber; 是否可以使用数据库触发器填充表的主键?或者我必须使用CustomGenerator 当我尝试上述方法时,我有以下异常 org.hibernate.id.IdentifierGenerat

我正在使用Hibernate4.1.0.Final和Spring3

我在实体类中有以下内容

@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
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)
数据库触发器没有任何序列,它正在使用

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

@GeneratedValue(generator="trig")
@GenericGenerator(name="trig", strategy="select", 
parameters=@Parameter(name="key", value="projectNo"))
上面抛出了以下异常

org.hibernate.id.IdentifierGenerationException: Unknown integral data type
for ids : java.lang.String
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)
从现在开始,你可以做到这一点

选择

通过选择,检索由数据库触发器分配的主键 该行由某个唯一键创建并检索主键值

从现在开始,你可以做到这一点

选择

通过选择,检索由数据库触发器分配的主键 该行由某个唯一键创建并检索主键值


问题是您使用的是字符串而不是数值。使用长字符而不是字符串,错误将消失

好了,您不能使用触发器来填充ID。事实上,Hibernate必须检索生成的ID,但由于它没有ID,我看不出它如何读回刚刚插入的行(鸡和蛋的问题)


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

问题是您使用的是字符串而不是数值。使用长字符而不是字符串,错误将消失

好了,您不能使用触发器来填充ID。事实上,Hibernate必须检索生成的ID,但由于它没有ID,我看不出它如何读回刚刚插入的行(鸡和蛋的问题)


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

我同意你的观点,顺序是正确的,但是这个应用程序的数据库人员坚持要有一个触发器。如果我使用CustomGenerator从数据库而不是sql查询中获取值怎么办?这是低效的还是两者都是一回事?我同意你的观点,顺序是正确的,但是这个应用程序的数据库人员坚持要有一个触发器。如果我使用CustomGenerator从数据库而不是sql查询中获取值呢?这是低效的还是两者都是一回事?@Polppan关于这个问题:。您可以使用@GeneratedValue(strategy=“trigger”)然后在EntityGaris中使用自然化,
@GeneratedValue(strategy=“trigger”)
抱怨类型不匹配:无法从字符串转换为GenerationType。对此有什么想法吗?使用
GenerationType.Auto
会导致以下
org.hibernate.exception.sqlgrammareexception:ORA-02289:序列不存在
Garis,我在我的原始问题中添加了一个更新作为Edit 1,在运行时我会得到空指针异常,即使触发器存在于表中。@Polppan截至此问题:。您可以使用@GeneratedValue(strategy=“trigger”)然后在EntityGaris中使用自然化,
@GeneratedValue(strategy=“trigger”)
抱怨类型不匹配:无法从字符串转换为GenerationType。对此有什么想法吗?使用
GenerationType.Auto
会导致以下
org.hibernate.exception.sqlgrammareexception:ORA-02289:序列不存在
Garis,我在我的原始问题中添加了一个更新作为Edit 1,在运行时我会得到空指针异常,即使表中存在触发器。