Java Hibernate使用数据库触发器填充主键
我正在使用Hibernate4.1.0.Final和Spring3 我在实体类中有以下内容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
@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,在运行时我会得到空指针异常,即使表中存在触发器。