我遵循一个基本的Hibernate教程。我试图在两个表之间建立一对一的关系。当我尝试插入Client
表时,它可以工作,但是当我尝试执行相反的操作(插入Facture
表)时,我得到了这个异常:
INFO: HHH000227: Running hbm2ddl schema export
Hibernate: alter table facture drop foreign key FK_i4kuo9pjcqstd2tpftv9eprbk
oct. 20, 2014 3:15:05 PM org.hibernate.tool.hbm2ddl.SchemaExport perform
ERROR: HHH000389: Unsuccessful: alter table facture drop foreign key FK_i4kuo9pjcqstd2tpftv9eprbk
oct. 20, 2014 3:15:05 PM org.hibernate.tool.hbm2ddl.SchemaExport perform
ERROR: Table 'mybase.facture' doesn't exist
Hibernate: drop table if exists client
Hibernate: drop table if exists facture
Hibernate: create table client (client_id integer not null auto_increment, Nom varchar(255), primary key (client_id))
Hibernate: create table facture (num_fact integer not null auto_increment, client_id integer, primary key (num_fact))
Hibernate: alter table facture add constraint FK_i4kuo9pjcqstd2tpftv9eprbk foreign key (client_id) references client (client_id)
oct. 20, 2014 3:15:05 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate: insert into facture (client_id) values (?)
oct. 20, 2014 3:15:05 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1452, SQLState: 23000
oct. 20, 2014 3:15:05 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Cannot add or update a child row: a foreign key constraint fails (`mybase`.`facture`, CONSTRAINT `FK_i4kuo9pjcqstd2tpftv9eprbk` FOREIGN KEY (`client_id`) REFERENCES `client` (`client_id`))
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:72)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3032)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3558)
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:98)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:490)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:195)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:179)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:214)
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:324)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702)
at com.zack.hibernate.Main.main(Main.java:28)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`mybase`.`facture`, CONSTRAINT `FK_i4kuo9pjcqstd2tpftv9eprbk` FOREIGN KEY (`client_id`) REFERENCES `client` (`client_id`))
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
这是客户端
类:
@Entity
@Table (name="client")
public class Client implements java.io.Serializable {
@Id /* pour dire a hibernate que id est une cle primaire*/
@GeneratedValue /* pour que hibernate générer automatiquement la clé primaire*/
private int client_id;
@Column(name="Nom")/* pour forcer hibernate a nommer la colonne par "Nom"*/
private String nom;
@OneToOne (mappedBy = "c")
private Facture f;
这是制作
类:
@Entity
@Table(name="facture")
public class Facture implements java.io.Serializable {
@Id
@GeneratedValue
private int num_fact;
@OneToOne
@JoinColumn(name = "client_id")
private Client c;
这是Main
类:
public class Main {
public class Main {
public static void main(String[] args) {
Client c = new Client();
c.setClient_id(1);
c.setNom("Zack Smith");
Facture f = new Facture();
f.setNum_fact(1);
//c une étape importante
c.setF(f);
f.setC(c);
SessionFactory s = new AnnotationConfiguration().configure().buildSessionFactory();
Session ss = s.openSession();
ss.beginTransaction();
ss.save(f);
ss.getTransaction().commit();
ss.close();
s.close();
}
}
数据库图片:http://hpics.li/f1a3ee7
public class Main {
public static void main(String[] args) {
Client c = new Client();
c.setId(1);;
c.setNom("Zack");
Facture f = new Facture();
f.setNum_fact(1);
f.setC(c);
c.setF(f);
// Facture f = new Facture();
// f.setNum_fact(1);
// //c une étape importante
// c.setF(f);
//
// f.setC(c);
SessionFactory s = new AnnotationConfiguration().configure().buildSessionFactory();
Session ss = s.openSession();
ss.beginTransaction();
ss.save(c);
ss.save(f);
ss.getTransaction().commit();
ss.close();
s.close();
}
}
===============================================================================================
oct. 22, 2014 6:50:34 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000227: Running hbm2ddl schema export
Hibernate: alter table Facture drop foreign key FK_rqdue6x5d4b9lg97rxve2fq20
oct. 22, 2014 6:50:34 PM org.hibernate.tool.hbm2ddl.SchemaExport perform
ERROR: HHH000389: Unsuccessful: alter table Facture drop foreign key FK_rqdue6x5d4b9lg97rxve2fq20
oct. 22, 2014 6:50:34 PM org.hibernate.tool.hbm2ddl.SchemaExport perform
ERROR: Table 'mybase.facture' doesn't exist
Hibernate: drop table if exists Client
Hibernate: drop table if exists Facture
Hibernate: create table Client (id integer not null auto_increment, nom varchar(255), primary key (id))
Hibernate: create table Facture (num_fact integer not null auto_increment, client_id integer, primary key (num_fact))
Hibernate: alter table Facture add constraint FK_rqdue6x5d4b9lg97rxve2fq20 foreign key (client_id) references Client (id)
oct. 22, 2014 6:50:34 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate: insert into Client (nom) values (?)
Hibernate: insert into Facture (client_id) values (?)
oct. 22, 2014 6:50:34 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost:3306/mybase]
谢谢你们的帮助,它的工作:)
在我看来,您可能对Hibernate如何建立这些关系有点困惑。我认为您的异常是由于您说您的clientId
列/字段是映射到Facture
表的生成值,而您实际上希望它将Client
表上的clientId
列/字段作为外键引用。因此,您正试图保存制作
对象,这将导致制作。要生成的clientId
列(因为您使用@GenericGenerator
对其进行了注释)。由于设置了此值,Hibernate尝试使用生成的ID更新现有的客户端
对象。由于该对象实际上不存在,因此您会收到您发布的异常。
您尝试做的基本上是允许Hibernate映射外键关系,以便您可以从Facture获取Client
,反之亦然。
您不需要指定联接列,Hibernate默认为所有关系的@Id
列。您应该修改客户端
类,如下所示
@Entity
@Table (name="client")
public class Client implements java.io.Serializable {
@Id
@GeneratedValue
private int clientId;
//Keep the nom field, I just removed it for brevity.
@OneToOne (cascade = CascadeType.ALL)
private Facture facture;
并修改您的制作
类,如下所示:
@Entity
@Table(name="facture")
public class Facture implements java.io.Serializable {
@Id
@GeneratedValue
private int factureId;
@OneToOne (cascade = CascadeType.ALL)
private Client client;
假设您的数据库设置正确,当您在其中任何一个对象上调用save时,这就是Hibernate正确保存对象所需的全部内容。
试试这个,如果你不能让它工作,让我知道。
我在使用hibernate和Oracle db执行限制条件时遇到问题。 简化的标准是: 这给了我NullPointerExceltion。我明白,我需要把setEscape处理(假)为了忽略括号{}在{宠物},但我不知道如何做到这一点,因为我正在使用标准。 如果有人能帮助我,我会很高兴的。 这是生成的异常: java.lang.oracle.jdbc.driver.T4C8Oall.getNumR
问题内容: 我在Spring中使用javax-validation和hibaernate-validator进行表单验证。除了用于Spring的基本必要JAR文件。 我包括: 验证API-1.1.0.Final hibernate-validator-5.1.0.Final 我读到某处也关注到了spl4j版本:所以我也告诉: 错误原因可以归因于slf4j和log4j兼容性吗? 我使用注释基础验证。
我正在尝试使用Quarkus构建一个小型REST服务。我正在使用Hibernate和PostgreSQL数据库。它在所有好的情况下都非常有效。但是当出现Hibernate异常时,比如,我无法以正常方式捕获它们。异常被包装为其他异常和。因此,可以通过使用 存储库 资源 由于这个问题,也无法为HibernateException添加一个。是否有人遇到过类似的问题,或者我的代码存在一般性问题?我正在使用
问题内容: 启动SpringMVC时,出现以下异常… 重要的细节似乎在错误中:org.hibernate.tool.hbm2ddl.SchemaUpdate-无法获取数据库元数据 我的servlet-context.xml如下… 我确定网址的详细信息和凭据对于数据库是正确的,还有谁能想到其他原因吗? 看起来它正在尝试访问information_schema数据库,但是在我的XML中,我已经设置了数
问题内容: 我的hibernate状态很严重。我遵循了各种书籍和在线教程,但是我曾经遇到过HibernateUtil.java Line抛出的相同异常“ ExceptionInInitializerError” 我的Tomcat日志显示以下内容: Account.java HibernateUtil.java hibernate.cfg.xml 我尝试了Hibernate 3.6.9和4.0.1(
nexr@Entity公共类产品{ 错误: