2011-11-01 72 views
0

请帮帮我。当我尝试在数据库中创建新行时,我收到了有关外键FOREIGNKEY_CUSTOMER_ID的信息。如果我只是编辑一些行它工作得很好。 这里的实体:休眠插入行外键错误

package entity; 
// Generated 01.11.2011 10:03:53 by Hibernate Tools 3.2.1.GA 


import java.math.BigDecimal; 
import java.util.Date; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 

/** 
* PurchaseOrder generated by hbm2java 
*/ 
@Entity 
@Table(name="PURCHASE_ORDER" 
    ,schema="APP" 
) 
public class PurchaseOrder implements java.io.Serializable { 


    private int orderNum; 
    private int customerId; 
    private int productId; 
    private Short quantity; 
    private BigDecimal shippingCost; 
    private Date salesDate; 
    private Date shippingDate; 
    private String freightCompany; 

    public PurchaseOrder() { 
    } 


    public PurchaseOrder(int orderNum, int customerId, int productId) { 
     this.orderNum = orderNum; 
     this.customerId = customerId; 
     this.productId = productId; 
    } 
    public PurchaseOrder(int orderNum, int customerId, int productId, Short quantity, BigDecimal shippingCost, Date salesDate, Date shippingDate, String freightCompany) { 
     this.orderNum = orderNum; 
     this.customerId = customerId; 
     this.productId = productId; 
     this.quantity = quantity; 
     this.shippingCost = shippingCost; 
     this.salesDate = salesDate; 
     this.shippingDate = shippingDate; 
     this.freightCompany = freightCompany; 
    } 

    @Id 

    @Column(name="ORDER_NUM", unique=true, nullable=false) 
    public int getOrderNum() { 
     return this.orderNum; 
    } 

    public void setOrderNum(int orderNum) { 
     this.orderNum = orderNum; 
    } 

    @Column(name="CUSTOMER_ID", nullable=false) 
    public int getCustomerId() { 
     return this.customerId; 
    } 

    public void setCustomerId(int customerId) { 
     this.customerId = customerId; 
    } 

    @Column(name="PRODUCT_ID", nullable=false) 
    public int getProductId() { 
     return this.productId; 
    } 

    public void setProductId(int productId) { 
     this.productId = productId; 
    } 

    @Column(name="QUANTITY") 
    public Short getQuantity() { 
     return this.quantity; 
    } 

    public void setQuantity(Short quantity) { 
     this.quantity = quantity; 
    } 

    @Column(name="SHIPPING_COST", precision=12) 
    public BigDecimal getShippingCost() { 
     return this.shippingCost; 
    } 

    public void setShippingCost(BigDecimal shippingCost) { 
     this.shippingCost = shippingCost; 
    } 
    @Temporal(TemporalType.DATE) 
    @Column(name="SALES_DATE", length=10) 
    public Date getSalesDate() { 
     return this.salesDate; 
    } 

    public void setSalesDate(Date salesDate) { 
     this.salesDate = salesDate; 
    } 
    @Temporal(TemporalType.DATE) 
    @Column(name="SHIPPING_DATE", length=10) 
    public Date getShippingDate() { 
     return this.shippingDate; 
    } 

    public void setShippingDate(Date shippingDate) { 
     this.shippingDate = shippingDate; 
    } 

    @Column(name="FREIGHT_COMPANY", length=30) 
    public String getFreightCompany() { 
     return this.freightCompany; 
    } 

    public void setFreightCompany(String freightCompany) { 
     this.freightCompany = freightCompany; 
    } 




} 


    <?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 01.11.2011 10:04:03 by Hibernate Tools 3.2.1.GA --> 
<hibernate-mapping> 
    <class name="entity.PurchaseOrder" table="PURCHASE_ORDER" schema="APP"> 
     <id name="orderNum" type="int"> 
      <column name="ORDER_NUM" /> 
      <generator class="increment" /> 
     </id> 
     <property name="customerId" type="int"> 
      <column name="CUSTOMER_ID" not-null="true" /> 
     </property> 
     <property name="productId" type="int"> 
      <column name="PRODUCT_ID" not-null="true" /> 
     </property> 
     <property name="quantity" type="java.lang.Short"> 
      <column name="QUANTITY" /> 
     </property> 
     <property name="shippingCost" type="big_decimal"> 
      <column name="SHIPPING_COST" precision="12" /> 
     </property> 
     <property name="salesDate" type="date"> 
      <column name="SALES_DATE" length="10" /> 
     </property> 
     <property name="shippingDate" type="date"> 
      <column name="SHIPPING_DATE" length="10" /> 
     </property> 
     <property name="freightCompany" type="string"> 
      <column name="FREIGHT_COMPANY" length="30" /> 
     </property> 
    </class> 
</hibernate-mapping> 

我的代码:

Session session = HibernateUtil.getSessionFactory().openSession(); 
      Transaction tr = session.beginTransaction(); 
      PurchaseOrder o = new PurchaseOrder(); 
o.setFreightCompany("Companytest"); 
        session.save(o); 
        tr.commit(); 

错误我收到:

Hibernate: select max(ORDER_NUM) from PURCHASE_ORDER 
Hibernate: insert into APP.PURCHASE_ORDER (CUSTOMER_ID, PRODUCT_ID, QUANTITY, SHIPPING_COST, SALES_DATE, SHIPPING_DATE, FREIGHT_COMPANY, ORDER_NUM) values (?, ?, ?, ?, ?, ?, ?, ?) 
ноя 01, 2011 10:45:21 AM org.hibernate.util.JDBCExceptionReporter logExceptions 
WARNING: SQL Error: -1, SQLState: 23503 
ноя 01, 2011 10:45:21 AM org.hibernate.util.JDBCExceptionReporter logExceptions 
SEVERE: INSERT в таблице 'PURCHASE_ORDER' вызывает нарушение ограничения чужого ключа 'FOREIGNKEY_CUSTOMER_ID' для ключа (0). Произведен откат оператора. 
ноя 01, 2011 10:45:21 AM org.hibernate.event.def.AbstractFlushingEventListener performExecutions 
SEVERE: Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: could not insert: [entity.PurchaseOrder] 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660) 
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) 
    at xml.XmlRead.main(XmlRead.java:69) 
Caused by: java.sql.SQLIntegrityConstraintViolationException: INSERT в таблице 'PURCHASE_ORDER' вызывает нарушение ограничения чужого ключа 'FOREIGNKEY_CUSTOMER_ID' для ключа (0). Произведен откат оператора. 
    at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source) 
    at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.executeUpdate(Unknown Source) 
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2247) 
    ... 11 more 
Caused by: org.apache.derby.client.am.SqlException: INSERT в таблице 'PURCHASE_ORDER' вызывает нарушение ограничения чужого ключа 'FOREIGNKEY_CUSTOMER_ID' для ключа (0). Произведен откат оператора. 
    at org.apache.derby.client.am.Statement.completeExecute(Unknown Source) 
    at org.apache.derby.client.net.NetStatementReply.parseEXCSQLSTTreply(Unknown Source) 
    at org.apache.derby.client.net.NetStatementReply.readExecute(Unknown Source) 
    at org.apache.derby.client.net.StatementReply.readExecute(Unknown Source) 
    at org.apache.derby.client.net.NetPreparedStatement.readExecute_(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.readExecute(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.flowExecute(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.executeUpdateX(Unknown Source) 
    ... 14 more 

org.hibernate.exception.ConstraintViolationException: could not insert: [entity.PurchaseOrder] 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660) 
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) 
    at xml.XmlRead.main(XmlRead.java:69) 
Caused by: java.sql.SQLIntegrityConstraintViolationException: INSERT в таблице 'PURCHASE_ORDER' вызывает нарушение ограничения чужого ключа 'FOREIGNKEY_CUSTOMER_ID' для ключа (0). Произведен откат оператора. 
    at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source) 
    at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.executeUpdate(Unknown Source) 
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2247) 
    ... 11 more 
Caused by: org.apache.derby.client.am.SqlException: INSERT в таблице 'PURCHASE_ORDER' вызывает нарушение ограничения чужого ключа 'FOREIGNKEY_CUSTOMER_ID' для ключа (0). Произведен откат оператора. 
    at org.apache.derby.client.am.Statement.completeExecute(Unknown Source) 
    at org.apache.derby.client.net.NetStatementReply.parseEXCSQLSTTreply(Unknown Source) 
    at org.apache.derby.client.net.NetStatementReply.readExecute(Unknown Source) 
    at org.apache.derby.client.net.StatementReply.readExecute(Unknown Source) 
    at org.apache.derby.client.net.NetPreparedStatement.readExecute_(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.readExecute(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.flowExecute(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.executeUpdateX(Unknown Source) 
    ... 14 more 

回答

1

首先,因为customerId属性未设置您的语句失败,但你有没有对相应的数据库行有空限制。尝试提供一个有效的号码作为customerId。

int customerId = 1; 
Session session = HibernateUtil.getSessionFactory().openSession(); 
Transaction tr = session.beginTransaction(); 
PurchaseOrder o = new PurchaseOrder(); 
o.setFreightCompany("Companytest"); 
o.setCustomerId(customerId); 
       session.save(o); 
       tr.commit(); 

我不太舒尔在误导字符串“FOREIGNKEY”来源于因为有外键关系目前还没有可能被侵犯,你在代码中的其他地方配置一些排序列前缀?

+0

非常感谢你的回复。即使使用o.setCustomerId(customerId),我仍然会得到此异常; 。我没有配置任何前缀。在实际数据库中,它表示FOREIGNKEY_CUSTOMER_ID FOREIGNKEY_PPRODUCT_ID。这是否意味着我有外国关系?对不起,我真的不会说英语。如果可以的话请帮忙。 – bunnyjesse112

+1

您的项目中是否有其他表格?例如,如果你有一个'CUSTOMER'表,那么你可以对你的'PURCHASE_ORDER'表有一个外键关系,并且如果你引用一个不存在的客户就会失败你的查询? –

+0

再次感谢您的回答。你能否重新解释我不明白。 – bunnyjesse112