#java #hibernate #foreign-keys
#java #впасть в спящий режим #внешние ключи
Вопрос:
Пожалуйста, помогите мне. Когда я пытаюсь создать новую строку в базе данных, я получаю что-то о внешнем ключе 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
что свойство не задано, но у вас есть ограничение not-null для соответствующей строки базы данных. Попробуйте указать действительный номер в качестве идентификатора клиента.
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», поскольку нет связи с внешним ключом, которая могла бы быть нарушена, настроили ли вы какой-то префикс столбца в каком-то другом месте кода?
Комментарии:
1. большое вам спасибо за ответ. я все еще получаю это исключение даже с помощью .setCustomerId(CustomerID); . я не настраивал никаких префиксов. в реальной базе данных указано FOREIGNKEY_CUSTOMER_ID FOREIGNKEY_PPRODUCT_ID. означает ли это, что у меня есть зарубежные связи? извините, я не очень хорошо говорю по-английски. пожалуйста, помогите, если можете.
2. У вас есть другие таблицы в вашем проекте? Например, если у вас есть
CUSTOMER
таблица, она может иметь отношение внешнего ключа к вашейPURCHASE_ORDER
таблице и не выполнит ваш запрос, если вы ссылаетесь на несуществующего клиента?3. еще раз спасибо за ответ. Не могли бы вы перефразировать, я не понимаю.
4. я понял, что вы имеете в виду. большое спасибо за помощь. ты потрясающий. теперь все работает.