2016-03-06 103 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

相關問題