【发布时间】:2017-04-01 13:55:54
【问题描述】:
今天我试图使用 Hibernate Annotation 将客户添加到数据库中,但我不知道为什么我面临一个表的引用问题!
请阅读下面的例外情况
错误:违反参照完整性约束:
"FKOFMCQE0O4K2TFOXB308SKTMQ3: PUBLIC.CUSTOMER FOREIGN 键(CUS_BILLINGADDRESSID)参考 PUBLIC.CUSTOMERBILLINGADDRESS(CUS_BILLINGADDRESSID) ('CBA00001')"; SQL 陈述: 更新客户集 cus_emailid=?, cus_mobileno=?, cus_name=?, cus_billingaddressid=?, cus_cartid=?, cus_loginid=?, cus_shippingaddressid=? cus_id=? [23506-193] 2017 年 4 月 1 日晚上 7:09:57 org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl 发布 信息:HHH000010:在批处理发布时,它仍然包含 JDBC 语句 2017 年 4 月 1 日晚上 7:09:57 org.hibernate.internal.ExceptionMapperStandardImpl mapManagedFlushFailure 错误:HHH000346:托管刷新期间出错 [org.hibernate.exception.ConstraintViolationException:无法 执行语句] 2017 年 4 月 1 日晚上 7:09:57 org.apache.catalina.core.StandardWrapperValve 调用 严重:servlet [dispatcher] 的 Servlet.service() 在路径 [/TechNXT] 的上下文中抛出异常 [请求处理失败;嵌套的 例外是 javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException:不能 执行语句] 有根本原因 org.h2.jdbc.JdbcSQLException:违反参照完整性约束:“FKOFMCQE0O4K2TFOXB308SKTMQ3:PUBLIC.CUSTOMER FOREIGN 键(CUS_BILLINGADDRESSID)参考 PUBLIC.CUSTOMERBILLINGADDRESS(CUS_BILLINGADDRESSID) ('CBA00001')"; SQL 陈述: 更新客户集 cus_emailid=?, cus_mobileno=?, cus_name=?, cus_billingaddressid=?, cus_cartid=?, cus_loginid=?, cus_shippingaddressid=? cus_id=? [23506-192] 在 org.h2.message.DbException.getJdbcSQLException(DbException.java:345) 在 org.h2.message.DbException.get(DbException.java:179) 在 org.h2.message.DbException.get(DbException.java:155) 在 org.h2.constraint.ConstraintReferential.checkRowOwnTable(ConstraintReferential.java:372) 在 org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:314) 在 org.h2.table.Table.fireConstraints(Table.java:967) 在 org.h2.table.Table.fireAfterRow(Table.java:985) 在 org.h2.command.dml.Update.update(Update.java:151) 在 org.h2.command.CommandContainer.update(CommandContainer.java:98) 在 org.h2.command.Command.executeUpdate(Command.java:258) 在 org.h2.server.TcpServerThread.process(TcpServerThread.java:344) 在 org.h2.server.TcpServerThread.run(TcpServerThread.java:158) 在 java.lang.Thread.run(Unknown Source)
这是我的两个模型表 注意:我已经生成了 getter 和 Setter,但没有发布,所以尽可能小 1. 客户表有其他表的引用
@Entity
public class Customer {
@Id
private String cus_id;
private String cus_name;
private String cus_emailid;
private String cus_mobileno;
@OneToOne(cascade=CascadeType.REFRESH)
@JoinColumn(name="cus_loginid")
private CustomerDetails customerdetails;
@OneToOne(cascade=CascadeType.REFRESH)
@JoinColumn(name="cus_billingaddressid")
private CustomerBillingAddress customerbillingaddress;
@OneToOne(cascade=CascadeType.REFRESH)
@JoinColumn(name="cus_shippingaddressid")
private CustomerShippingAddress customershippingaddress;
@OneToOne(cascade=CascadeType.REFRESH)
@JoinColumn(name="cus_cartid")
private CustomerCart customercart;
-
我的客户帐单地址模型
@实体 公共类 CustomerBillingAddress {
@Id private String cus_billingaddressid; private String cus_houseno; private String cus_street; private String cus_area; private String cus_city; private String cus_state; private String cus_country; private String cus_pincode; @OneToOne(mappedBy="customerbillingaddress") private Customer customer;
其他型号类似
最后是我的 DAO 方法,它将客户添加到 db
这是代码!
@Transactional
public String addCustomer(Customer customer) {
System.out.println("CustomerDao -TechNXT\n");
Session ses = sf.openSession();
customer.setCus_id(generateCustomerid());
customer.setCustomerbillingaddress(new CustomerBillingAddress());
customer.setCustomershippingaddress(new CustomerShippingAddress());
customer.setCustomercart(new CustomerCart());
customer.getCustomerdetails().setCus_loginid(generateCustomerLoginid());
customer.getCustomerbillingaddress().setCus_billingaddressid(generateCustomerBillingid());
customer.getCustomershippingaddress().setCus_shippingaddressid(generateCustomershippingid());
customer.getCustomercart().setCus_cartid(generateCustomerCartid());
customer.getCustomerdetails().setCus_isenabled(true);
customer.getCustomerdetails().setCus_role("ROLE_USER");
Transaction tr = ses.beginTransaction();
ses.save(customer);
tr.commit();
ses.close();
return customer.getCustomerdetails().getCus_loginid();
}
好吧,我从 3 小时开始就一直在尝试,但未能找到解决方案! 很抱歉占用您宝贵的时间。 并提前感谢您对我的帮助!
【问题讨论】:
-
您在 Customer 的 CustomerBillingAddress 字段上尝试过 Cascadetype.All 吗?
-
您应该使用 Google Hibernate Cascadetype 并阅读它,例如dineshonjava.com/p/cascadetypes-and-other-things.html?m=1
-
我回答了另一个问题。 CascadeType.ALL 包括所有级联,这意味着当您删除客户对象时,字段中的对象也会被删除。如果您只想要几种类型,请使用
@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST}) e.g. -
@JackFlamp 非常感谢!先生,我在哪里可以跟着你:)
标签: java sql hibernate spring-mvc