`
zzxplayful
  • 浏览: 52188 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate的级联删除问题

阅读更多
   我有两个表一个是news表,一个是newsType表
   如下:
    CREATE  TABLE NewsType(
       TypeID  int PRIMARY KEY  NOT NULL identity(1,1) ,
       TypeName  VARCHAR(400) NOT NULL,
       DirName   VARCHAR(400) NOT NULL,
       TemplateName VARCHAR(400) NOT NULL
);
CREATE  TABLE  News
(
       NewsID  int identity(1,1) PRIMARY KEY ,
       TypeID  int NOT NULL references NewsType(TypeID) on delete cascade,
       Title  VARCHAR(400) NOT NULL,
       HitCount int DEFAULT  0 NOT NULL,
       IssuseDate  datetime NOT NULL,
       DeployerID  int NOT  NULL,
       Origin  VARCHAR(400)  NOT  NULL,
      URL  VARCHAR(400) NOT NULL,
       KEYWORDS VARCHAR(400) ,
        Priority  int  DEFAULT  0 NOT NULL,
       Special  VARCHAR(400) ,
       Description  VARCHAR(400),
       Author  VARCHAR(400),
       Topic   VARCHAR(400)

);
下面是:News.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="cn.model.mapping.News" table="News" schema="dbo" catalog="demo">
        <id name="newsId" type="java.lang.Integer">
            <column name="NewsID" />
            <generator class="native" />
        </id>
        <!-- <property name="typeId" column="TypeID" type="java.lang.Integer" not-null="true"/> -->
       
        <many-to-one name="newsType" class="cn.model.mapping.NewsType" fetch="select" insert="false" update="false">
            <column name="TypeID" not-null="true" />
        </many-to-one>
        <property name="title" type="java.lang.String">
            <column name="Title" length="400" not-null="true" />
        </property>
        <property name="hitCount" type="java.lang.Integer">
            <column name="HitCount" not-null="true" />
        </property>
        <property name="issuseDate" type="java.util.Date">
            <column name="IssuseDate" length="23" not-null="true" />
        </property>
        <property name="deployerId" type="java.lang.Integer">
            <column name="DeployerID" not-null="true" />
        </property>
        <property name="origin" type="java.lang.String">
            <column name="Origin" length="400" not-null="true" />
        </property>
        <property name="url" type="java.lang.String">
            <column name="URL" length="400" not-null="true" />
        </property>
        <property name="keywords" type="java.lang.String">
            <column name="KEYWORDS" length="400" />
        </property>
        <property name="priority" type="java.lang.Integer">
            <column name="Priority" not-null="true" />
        </property>
        <property name="special" type="java.lang.String">
            <column name="Special" length="400" />
        </property>
        <property name="description" type="java.lang.String">
            <column name="Description" length="400" />
        </property>
        <property name="author" type="java.lang.String">
            <column name="Author" length="400" />
        </property>
        <property name="topic" type="java.lang.String">
            <column name="Topic" length="400" />
        </property>
    </class>
</hibernate-mapping>

NewsType.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="cn.model.mapping.NewsType" table="NewsType" schema="dbo" catalog="demo">
        <id name="typeId" type="java.lang.Integer">
            <column name="TypeID" />
            <generator class="native" />
        </id>
        <property name="typeName" type="java.lang.String">
            <column name="TypeName" length="400" not-null="true" />
        </property>
        <property name="dirName" type="java.lang.String">
            <column name="DirName" length="400" not-null="true" />
        </property>
        <property name="templateName" type="java.lang.String">
            <column name="TemplateName" length="400" not-null="true" />
        </property>
        <set name="newses" inverse="true" cascade="all-delete-orphan">
            <key>
                <column name="TypeID" not-null="true" />
            </key>
            <one-to-many class="cn.model.mapping.News" />
        </set>
    </class>
</hibernate-mapping>

当我测试的时候  我要向news表里单独插入数据的时候,就出现异常:
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert: [cn.model.mapping.News]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:1986)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2405)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:37)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:269)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:167)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:530)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
at cn.model.test.Test.main(Test.java:68)
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]无法将 NULL 值插入列 'TypeID',表 'demo.dbo.News';该列不允许空值。INSERT 失败。

但是,要是同是向两个表里插入数据时,就能成功。是怎么回事啊?

Test.java

package cn.model.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import cn.model.HibernateSessionFactory;
import cn.model.mapping.NewsType;

public class Test {



public static void main(String args[]){

Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();

Query query=session.createQuery("from NewsType nt where nt.typeId=13");
List list=query.list();
NewsType newsType=(NewsType)list.get(0);
session.delete(newsType);
session.flush();
session.close();

}

}

分享到:
评论
3 楼 wtb 2006-12-27  
哪个字段可以为空值,那么你在数据库中就应该设置允许为空,并且在相应的hbm.xml文件中的property块中的not-null设为false。
删除不了,你先看看log4j的debug信息显示了什么,有没有执行到数据库的delete语句,如果没有,有可能你没有执行session的commit。
2 楼 zzxplayful 2006-12-26  
wtb 写道
引用
TypeID int NOT NULL references NewsType(TypeID) on delete cascade,

你设置了本字段不准为空,并且外健关联新闻类别表的TypeID字段,你插入一条新闻记录,不设置这个字段那这个字段不就为空了?你自己定义的说不能为空,你以用空值,他不出错就怪了。
那你说应该怎么改呢?
小弟刚刚学hibernate.
但是,当我删除的时候,不出现异常,可是数据库里的数据根本就没有被删除。不知道是怎么回事
1 楼 wtb 2006-12-26  
引用
TypeID int NOT NULL references NewsType(TypeID) on delete cascade,

你设置了本字段不准为空,并且外健关联新闻类别表的TypeID字段,你插入一条新闻记录,不设置这个字段那这个字段不就为空了?你自己定义的说不能为空,你以用空值,他不出错就怪了。

相关推荐

    hibernate 级联查询

    4. **级联查询示例**:例如,一个用户可以有多个订单,当删除用户时,如果设置了级联删除,那么相关的订单也会被一起删除。 5. **级联操作的优缺点**:优点是简化了代码,提高了开发效率;缺点是如果不合理使用,...

    关于Hibernate级联删除的问题.doc

    在文档中提到的场景下,我们来详细探讨Hibernate级联删除的原理和配置方法。 首先,我们要理解关系映射中的几个关键概念。在给出的例子中,有四个表:A、AA、B和BB,它们之间存在一对多(one-to-many)和一对一...

    hibernate many-to-many级联保存,级联更新,级联删除

    本文将深入探讨如何在Hibernate中处理Many-to-Many关系的级联保存、级联更新和级联删除。 一、Many-to-Many关系基础 在数据库设计中,Many-to-Many关系意味着两个实体之间存在多对多的关系。例如,学生可以选修多门...

    Hibernate的级联操作(增,删,该)

    2. 级联删除(Cascade Type.REMOVE) 当设置为`CascadeType.REMOVE`时,如果删除了父实体,与之关联的子实体也会被删除。这在处理一对多或者多对多关系时非常有用,可以确保相关的数据在数据库中得到一致性的清理。...

    Hibernate级联操作一对多demo

    通过这个" Hibernate级联操作一对多demo ",开发者可以深入理解如何在实际项目中利用Hibernate的级联功能来简化代码,提高开发效率,同时也要注意潜在的风险和性能问题。在实践中不断优化,才能更好地掌握这一强大的...

    hibernate级联增删改查

    本主题将深入探讨"hibernate级联增删改查",特别是针对"t_card主表"和"t_person从表"的关系。 首先,级联操作在Hibernate中是一种配置,用于指定当主表中的实体发生变化时,是否以及如何更新或删除关联的从表实体。...

    hibernate 级联(cascade和inverse)一对多

    一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...

    Hibernate级联操作.docx

    在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...

    Hibernate 一对多、多对一、级联、加载、反转

    5. **反转关系**:反转关系涉及到主从关系的反转,通常用于解决级联操作带来的问题。例如,如果在`User`和`Order`的关系中,我们希望由`User`来控制级联操作,可以将`@OneToMany`的`mappedBy`属性设在`User`上,然后...

    Hibernate cascade (级联).doc

    ### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    hibernate3.2的级联关系_JavaProject

    级联关系在Hibernate中是指当一个实体发生某种操作(如保存、更新、删除)时,是否会影响到与之相关联的其他实体。通过配置级联关系,我们可以控制这些关联实体的行为。 1. **一对多(OneToMany)**:在数据库中,...

    hibernate3.2级联关系自身一对多双向关联

    首先,级联关系是指当对主对象进行某些操作(如保存、更新、删除等)时,这些操作也会自动应用到与之相关联的从属对象上。这减少了代码量,并保持了数据的一致性。在Hibernate中,可以通过在`@ManyToOne`或`@...

    Hibernate_范型_级联

    而级联(Cascading)则是Hibernate中处理关联对象的一种策略,它定义了当一个实体被保存、更新或删除时,与之关联的其他实体应该如何处理。 【描述】: Hibernate中的范型主要体现在SessionFactory、Session、...

    struts2 hibernate 实现无限级联 树形分类

    在这个"struts2 hibernate 实现无限级联 树形分类"项目中,主要目标是创建一个能够展示无限级联的树形分类结构。这种结构通常用于组织层次化的数据,如产品类别、部门结构或者权限角色等。无限级联意味着这个树可以...

    解析Oracle中多表级联删除的方法

    在Oracle数据库中,多表级联删除是一种常见的需求,特别是在数据关系复杂的环境中。级联删除允许在删除一个表中的记录时,自动删除依赖于该记录的其他表中的相关记录。以下将详细介绍三种在Oracle中实现多表级联删除...

    详解Hibernate cascade级联属性的CascadeType的用法

    详解Hibernate cascade级联属性的CascadeType的用法 cascade(级联) 级联在编写触发器时经常用到,触发器的作用是当 主控表信息改变时,用来保证其关联表中数据同步更新。若对触发器来修改或删除关联表相记录,必须...

    hibernate基础 二 关联映射 级联操作

    ### Hibernate基础之关联映射与级联操作 #### 第一部分:主键生成策略与对象状态管理 ##### 主键生成策略 在使用Hibernate框架时,合理的主键生成策略能够极大地简化开发工作并提升应用性能。Hibernate提供了多种...

    struts2 hibernate 框架 三级城市级联

    通过配置Hibernate的映射文件(hbm.xml),可以将数据库表与Java类关联起来,然后使用Session接口进行CRUD操作(创建、读取、更新、删除)。 实现三级城市级联的具体步骤可能包括以下部分: 1. **设计数据库模型**...

    hibernate的应用表之间的级联关系

    2. **数据完整性**:级联删除可能导致意外的数据丢失,因此在使用`CascadeType.DELETE`时需格外小心。 3. **事务管理**:级联操作通常在同一个事务中进行,确保数据一致性。如果不在同一个事务中,可能会引发并发...

Global site tag (gtag.js) - Google Analytics