2016-03-06 57 views
2

大家早上好Hibernate和HSQLDB违反主键完整性约束

我在Hibernate中使用HSQLDB。我有一种情况,即使我设置了主键值,我仍然得到integrity constraint violation: NOT NULL check constraint; SYS_CT_10346 table: NUMBERS column: PK。如下所示。

SEVERE: integrity constraint violation: NOT NULL check constraint; SYS_CT_10346 table: NUMBERS column: PK 
org.hibernate.exception.ConstraintViolationException: could not insert: [entity.Numbers] 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638) 
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250) 
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298) 
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181) 
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187) 
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172) 
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70) 
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535) 
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523) 
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519) 
    at dbconn.NumbersDB.saveNumbers(NumbersDB.java:75) 
    at gui.UI.saveNumberStateButtonActionPerformed(UI.java:1807) 
    at gui.UI.access$1800(UI.java:39) 
    at gui.UI$20.actionPerformed(UI.java:788) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:688) 
    at java.awt.EventQueue$3.run(EventQueue.java:686) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:702) 
    at java.awt.EventQueue$4.run(EventQueue.java:700) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:699) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10346 table: NUMBERS column: PK 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source) 
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33) 
    ... 55 more 

这里是我的映射

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 22 Feb 2016 9:01:34 PM by Hibernate Tools 3.2.1.GA --> 
<hibernate-mapping> 
    <class name="entity.Numbers" table="NUMBERS" schema="PUBLIC" catalog="PUBLIC"> 
     <id name="pk" type="int"> 
      <column name="PK" /> 
      <generator class="native" /> 
     </id> 
     <many-to-one name="account" class="entity.Account" fetch="select"> 
      <column name="ALLOCATEDACCOUNT"/> 
     </many-to-one> 
     <property name="number" type="string"> 
      <column name="NUMBER" length="25" not-null="true" /> 
     </property> 
     <property name="allocated" type="boolean"> 
      <column name="ALLOCATED" not-null="true" /> 
     </property> 
     <property name="alias" type="string"> 
      <column name="ALIAS" length="25" /> 
     </property> 
     <property name="geographic" type="java.lang.Boolean"> 
      <column name="GEOGRAPHIC" /> 
     </property> 
    </class> 
</hibernate-mapping> 

我的实体类

package entity; 
// Generated 21 Feb 2016 1:44:55 AM by Hibernate Tools 3.2.1.GA 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

/** 
* Numbers generated by hbm2java 
*/ 
@Entity 
@Table(name = "NUMBERS", schema = "PUBLIC", catalog = "PUBLIC") 
public class Numbers implements java.io.Serializable { 

    private Integer pk; 
    private String number; 
    private Account account; 
    private boolean allocated; 
    private String alias; 
    private Boolean geographic; 

    public Numbers() { 
    } 

    public Numbers(Integer pk, String number, boolean allocated) { 
     this.pk = pk; 
     this.number = number; 
     this.allocated = allocated; 
    } 

    public Numbers(Integer pk, Account account, String number, boolean allocated, String alias, Boolean geographic) { 
     this.pk = pk; 
     this.account = account; 
     this.number = number; 
     this.allocated = allocated; 
     this.alias = alias; 
     this.geographic = geographic; 
    } 

    @Id 
    @Column(name = "PK", unique = true, nullable = false)  
    public Integer getPk() { 
     return this.pk; 
    } 

    public void setPk(Integer pk) { 
     this.pk = pk; 
    } 

    @Column(name = "NUMBER", nullable = false, length = 25) 
    public String getNumber() { 
     return this.number; 
    } 

    public void setNumber(String number) { 
     this.number = number; 
    } 

    @Column(name = "ALLOCATED", nullable = false) 
    public boolean isAllocated() { 
     return this.allocated; 
    } 

    public void setAllocated(boolean allocated) { 
     this.allocated = allocated; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "ALLOCATEDACCOUNT") 
    public Account getAccount() { 
     return this.account; 
    } 

    public void setAccount(Account account) { 
     this.account = account; 
    } 

    @Column(name = "ALIAS", length = 25) 
    public String getAlias() { 
     return this.alias; 
    } 

    public void setAlias(String alias) { 
     this.alias = alias; 
    } 

    @Column(name = "GEOGRAPHIC") 
    public Boolean getGeographic() { 
     return this.geographic; 
    } 

    public void setGeographic(Boolean geographic) { 
     this.geographic = geographic; 
    } 
} 

,最后的代码,我想执行

public boolean saveNumbers(Set numbersSet) { 
     try { 
      Session session = HibernateUtil.getSessionFactory().openSession(); 
      session.beginTransaction(); 
      for (Iterator<Numbers> it = numbersSet.iterator(); it.hasNext();) { 
       Numbers numbers = it.next(); 
       if (numbers.getPk() == null) { 
        numbers.setPk(new Integer(5)); 
        session.save(numbers); 
       } else { 
        numbers = (Numbers) session.merge(numbers); 
        session.saveOrUpdate(numbers); 
       } 
      } 
      session.getTransaction().commit(); 
      return true; 
     } catch (HibernateException he) { 
      he.printStackTrace(); 
      return false; 
     } 
    } 

例外越来越抛出session.save(numbers);

即使我手动设置主键,如上面的示例所示,它仍然会抛出异常。 我试图设置注释,如下所示,但这仍然给我同样的例外。

@Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "PK", unique = true, nullable = false) 

您的援助将不胜感激

谢谢

+0

不要使用不必要的属性'@Column(name = “PK”,独特= TRUE,可为空= FALSE)' - '@ Id'意味着它是独一无二的!我不确定'nullable = false',但有一个_generated value_,你不需要它。 –

+0

谢谢你的建议,但即使拿出唯一=真,它仍然抛出同样的例外 – BrianJohnson

+0

不客气。当然,它并不能解决一个错误。这只是一个建议。 –

回答

3

早安所有

所以经过太多的痛苦和苦难的答案,问题是如下,创建表不要忘记设置主键身份时。谢谢大家的想法。

问候

布赖恩

0

你不已经分配PK分配相同的PK 5的所有实体。这意味着,您尝试使用完全相同的PK值保存所有新实例。

如果您使用的是生成的ID,请不要将任何内容分配给实体的PK字段。

+0

嗨有感谢您花时间回答。我用它来证明,即使静态设置一次,它仍然会抛出一个异常。问题是,即使我把它拿出来,我得到这个理智的问题 – BrianJohnson

+0

然后设置PK栏为空。例外说明不是空检查没有通过。 Numbers在你的PK领域,你是从哪里得到可空=假的?它说从hbm.xml生成,但你没有改变它?还要检查哪个优先是hbm.xml还是注释。 – newohybat

+0

再次感谢您。生成XML时,我得到了nullable = false。所看到的实体代码是生成的,我一直在试图改变它以使其起作用。所有我的其他实体类都有相同的注释,所以我非常沮丧于此。我怎样才能确定帽子优先? – BrianJohnson

相关问题