实体具有基于顺序分配的主键,但DB oracle抛出错误不能为主键插入null

时间:2012-11-13 20:25:01

标签: oracle hibernate jpa jboss sequence

我有一个非常有趣的情况,我从来没有过。我正在使用JPA和jboss-as-7.1.3,我有一个实体,它有一个基于序列的主键。序列的缓存值为20,并且递增1.很简单吧?当我坚持这个所述实体并退出事务并且实体被刷新到DB时,问题就出现了。我得到oracle投掷“无法在db中为主键插入null”。

为了尝试解决问题,我(使用指向jboss实例的netbeans调试)在每次分配值后打印出实体。并且,在我坚持对象之后。然后我跳过/进入逻辑调用。我发现主键变量有一个值并被填充(以及其他两个字段/列)。然后,我退出(跳过)该方法,并将实体无缝地提交给DB,然后抛出错误。

这是我的班级,名字已取出。

@SequenceGenerator(name = "SEQ", sequenceName="SEQ_GEN", allocationSize=1, initialValue=1)
public class E2 implements Serializable, ModelObject<Long> {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ")
@Basic(optional = false)
@Column(name = "ID")
    @XmlAttribute
private Long Id;

请记住,我在不同的实体(E1)上使用这个完全相同的序列,并且没有任何问题提交给DB。

基本上我创建了E1并刷新到数据库,在某些情况下我创建E2分配所需的字段/列并保留E2。

  E2 e2 = new E2();
  e2.setE1Id(parentE1Id);
  e2.setE1Id(childE1Id);
  e2 = this.em.persist(stack);                
  LOGGER.trace("{}",stack);

11:06:44,852 TRACE [crud](Thread-5(HornetQ-client-global-threads-55905567))创建新E2后退出[Id = 39,parentE1Id = 78837,childE1Id = 78947]

11:06:44,891 WARN [com.arjuna.ats.arjuna](Thread-5(HornetQ-client-global-threads-55905567))ARJUNA012125:TwoPhaseCoordinator.beforeCompletion - SynchronizationImple&lt; failed 0:ffff0a2480e1:12a81bc3:50a3bfef:1f0,org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization@1330e9fe&gt;:javax.persistence.PersistenceException:org.hibernate.exception.ConstraintViolationException:ORA-01400:无法插入NULL ( “HI”, “E2”, “ID”)

引起:org.hibernate.exception.ConstraintViolationException:ORA-01400:无法插入NULL(“HI”。“E2”。“ID”)

另外,刚刚打印出hibernate jdbc的东西得到了:

12:26:25,771 INFO  [stdout] (Thread-10 (HornetQ-client-global-threads-55905567)) Hibernate: insert into E2 (CHILD_E1_ID, PARENT_E1_ID) values (?, ?)

我的问题是:

当标记为@Id时,id字段如何不进入表的insert语句?

当JPA应该自动递增序列时,怎么会发生这种情况?

如何解决这个问题?

-DpDb

PS。对不起,如果我遗漏了任何重要信息,如果需要更多信息,请要求编辑。

0 个答案:

没有答案