0 0

hibernate 删除 外键约束5

写了两个类:        Subject(一端)  Comment(多端)
其对应hbm xml(截取)为:
subject.hbm.xml:
        <set
            name="comments"
            lazy="true"
            inverse="true"
            cascade="all"
            sort="unsorted"
        >
            <cache
                usage="read-write"
             />

              <key
                  column="subjectid"
              />

              <one-to-many
                  class="com.module.Comment"
              />
        </set>

//***************************************
comment.hbm.xml:

       <many-to-one
            name="subject"
            class="com.module.Subject"
            cascade="none"
            outer-join="auto"
            update="true"
            insert="true"
            column="subjectid"
        />

问题:当删除subject时提示:
- SQL Error: 1451, SQLState: 23000
- Duplicate key or integrity constraint violation,  message from server: "Cannot delete or update a parent row: a foreign key constraint fails (`lnc/t_comment`, CONSTRAINT `FKF437E194F69C747` FOREIGN KEY (`subjectid`) REFERENCES `t_subject` (`id`))"
- Could not synchronize database state with session
org.springframework.dao.DataIntegrityViolationException: Hibernate operation: could not delete: [com.module.Subject#32769]; SQL []; Duplicate key or integrity constraint violation,  message from server: "Cannot delete or update a parent row: a foreign key constraint fails (`lnc/t_comment`, CONSTRAINT `FKF437E194F69C747` FOREIGN KEY (`subjectid`) REFERENCES `t_subject` (`id`))"; nested exception is java.sql.SQLException: Duplicate key or integrity constraint violation,  message from server: "Cannot delete or update a parent row: a foreign key constraint fails (`lnc/t_comment`, CONSTRAINT `FKF437E194F69C747` FOREIGN KEY (`subjectid`) REFERENCES `t_subject` (`id`))"
java.sql.SQLException: Duplicate key or integrity constraint violation,  message from server: "Cannot delete or update a parent row: a foreign key constraint fails (`lnc/t_comment`, CONSTRAINT `FKF437E194F69C747` FOREIGN KEY (`subjectid`) REFERENCES `t_subject` (`id`))"
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1977)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1163)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1272)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2236)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1741)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1588)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
at net.sf.hibernate.impl.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:22)
at net.sf.hibernate.persister.EntityPersister.delete(EntityPersister.java:581)
at net.sf.hibernate.impl.ScheduledDeletion.execute(ScheduledDeletion.java:29)
at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2449)
at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2435)
at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2397)
at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2261)
请碰到过这个问题的朋友帮我看看(inverse="false" 时可以删除‘一端’,但我想把维护交给‘多端‘Comment)?

问题补充:
mrliang 写道
你要删除的subject是一端而不是多端啊,当然会外键冲突了。


的确是这样,所以我想在删除 '一端'之前把与之有关联的'多端'记录先删掉或设置外键subjectid = null,按道理这样在去删 '一端'是没有就问题的,但当执行到删除'一端'时又出现异常(此时其对应的多端记录在程序里已经执行了remove,但刷新数据库记录依然健在),大致意思是说 两个不同的对象实例想用了同一个session id,我想可不可在'多端'和'一端'的删除之间做一个session 清理什么的,这样应该就能与数据库同步?
2010年10月19日 10:39

4个答案 按时间排序 按投票排序

0 0

采纳的答案

在删除subject时,因为你在<set>标签中有inverse="true"让<key>标签失效,这样在一端这方就不能准确获得外键信息,所以直接删除会报错,应该是要先解除关系之后再删除

2010年10月20日 10:14
0 0

把你的删除代码贴上来看看

2010年10月20日 13:21
0 0

你要删除的subject是一端而不是多端啊,当然会外键冲突了。

2010年10月19日 14:43
0 0

维护就是要交给多的 一端

2010年10月19日 11:27

相关推荐

    Hibernate使用外键ForeignKey

    2. **外键约束的类型**: - `UNIQUE`: 外键列的值必须唯一,不允许重复。 - `NOT NULL`: 外键列的值不能为空。 - `CASCADE`: 当主键表中的记录被删除或更新时,自动更新或删除外键表中的对应记录。 - `SET NULL`...

    hibernate基于主外键的一对多/多对一关联

    "hibernate基于主外键的一对多/多对一关联"是Hibernate中两个核心的概念,用于描述实体之间的关系。下面将详细阐述这两个关联类型及其实现方式。 一对多关联是指在数据库中,一个表的记录可以与另一个表中的多个...

    Hibernate基于外键的一对多单向关联

    描述中提到的“NULL”表明没有提供具体的描述信息,但通常这种主题会涉及到如何在Hibernate的映射文件或者注解中设置外键约束,以及如何在Java代码中操作这种关联关系。由于提供了博客链接,这可能是博主对这一主题...

    MLDN魔乐科技JAVA培训_Oracle课堂18_外键约束.rar

    在实际的Java开发中,特别是在使用JDBC或ORM框架如Hibernate进行数据库操作时,理解外键约束对于编写正确且高效的SQL查询至关重要。例如,使用Hibernate时,外键约束可以帮助实现对象关系映射,使得对象间的关联可以...

    hibernate一对一之唯一外键关联(双向关联)

    - 在一对一关联中,唯一外键关联是指在一个实体中定义了另一个实体的主键作为其字段,形成外键约束,确保了数据的一致性和完整性。 3. **双向关联与单向关联** - **单向关联**:只有一方知道另一方的存在,例如...

    hibernate一对一唯一外键关联映射(单项关联)

    由于是唯一外键,`person_id`字段应设置为主键或者具有唯一性约束。 4. **操作关联对象**: 在程序中,我们可以创建一个Person对象,然后给它赋一个Address对象,最后通过SessionFactory的save或update方法保存到...

    Hibernate一对一外键映射

    这与数据库层面的外键约束类似,但在Hibernate中,我们通过注解或XML配置文件来定义这种关联。通常,一方实体会包含对方的主键,而另一方实体则可能没有反向引用。 **映射方式** 1. **注解映射:** 使用`@...

    Hibernate关联映射-one to one单向外键关联

    如果需要在`Account`表中也添加外键约束,可以使用`inverse="true"`属性,这样外键将被定义在`Account`实体上。 使用注解的方式同样简单。在`User`类中,我们可以这样定义: ```java @Entity public class User { ...

    hibernate组件之间的关联

    这种关联可以通过 @OneToOne 注解来实现,并且可以配置为外键约束或者无外键约束。外键约束通常通过 @JoinColumn 或 @PrimaryKeyJoinColumn 来指定。 **一对多关联(One-to-Many)** 一对多关联是最常见的关联类型...

    Hibernate学习:单向多对一关联 工程

    Hibernate会自动处理这个,但有时需要手动创建或调整外键约束。 4. **级联保存和更新**:当一个`Employee`加入新的`Department`时,可以通过级联操作自动更新`Employee`的`dept_id`字段。 5. **查询优化**:为了...

    Hibernate之第3解之-hibernate_hibernate_many2one_1

    在Hibernate配置文件或JPA注解中指定外键字段,即可在数据库创建时自动创建外键约束。 6. **查询优化**: 当处理大量关联数据时,需要关注N+1查询问题。如果不对关联关系进行合理优化,可能会导致性能瓶颈。使用...

    Hibernate映射实例

    映射可以通过外键约束或者主键共享来建立。如果使用外键,需要在关联的实体类上添加`@OneToOne`和`@JoinColumn`注解,指定外键字段。如果是主键共享,可以使用`@PrimaryKeyJoinColumns`注解。 ### 一对多映射 在...

    Hibernate教程20_关系映射案例三

    10. **外键约束**:在数据库中,关系映射往往涉及到外键约束,Hibernate可以通过注解或映射文件来指定外键的创建和管理。 11. **查询语言**:Hibernate支持HQL(Hibernate Query Language)和 Criteria API 来执行...

    hibernate中的 一对一唯一外键双向关联

    3. **外键约束**:在数据库层面,需要创建外键约束来保证数据的一致性。 4. **性能考虑**:一对一关联可能会增加数据库查询的复杂性,因此在设计时需权衡性能和业务需求。 总之,一对一唯一外键双向关联在...

    hibernate的关系映射

    在关系映射中,外键约束可以是物理的(在数据库层面定义)或逻辑的(由Hibernate管理)。逻辑外键通过Hibernate的映射机制实现,无需在数据库中创建外键约束。 **总结** Hibernate的关系映射提供了强大的工具,...

    Hibernate学习要点_one2one 一对一主键双线关联

    `constrained="true"`属性在`&lt;one-to-one&gt;`标签中,表示该关系是强制的,即如果删除了`idCard`实体,则`Person`实体也将被删除,这体现了数据库中的外键约束。 ### 实现细节与注意事项 1. **实体类设计**:在Java...

    详解Hibernate一对一映射配置

    - `constrained`属性用于指定外键约束是在哪一方,如果为`true`,则外键约束在被引用的一方。 - `fetch`属性用于指定加载策略,`join`表示在查询时一起加载,`select`表示延迟加载。 - `property-ref`属性用于指定...

    Hibernate_容器映射技术笔记

    在MySQL中,可以设置外键约束的`ON DELETE CASCADE`来实现这一功能,这样在删除Person记录时,相应的emails记录也会被删除。 在Hibernate中,级联删除可以通过配置`&lt;set&gt;`或其他集合类型的标签实现,如`&lt;cascade&gt;`...

    Hibernate双向一对一关联映射(注解版)

    这种关联关系在数据库层面通常通过主键外键约束来实现,但在代码层面则通过注解来表达。 首先,我们需要了解两个核心的注解:`@OneToOne`和`@JoinColumn`。`@OneToOne`用于声明一对一的关系,而`@JoinColumn`用于...

    Hibernate 关联关系解除

    1. 数据库级约束:某些关联可能受到数据库级别的外键约束,删除操作可能需要先解除约束或设置适当的级联行为。 2. 数据一致性:解除关联可能导致数据不一致,需要确保业务逻辑的正确性。 3. 性能影响:大量关联解除...

Global site tag (gtag.js) - Google Analytics