`

hibernate4.3.5 单向一对多 的诡异行为

 
阅读更多
版本:hibernate4.3.5
单向一对多,一端为主控端。一个person实体有多个address实体.采用主外键的方式。
person表有person_id,name,age三个cloumn,其中为PK。
address表有address_id,address_name,person_id,其中address_id为PK,person_id为FK,且为notNull。
person实体的定义:
@Id
@Column(name="PERSON_ID")
private int personId = 0;

@Column(name="NAME")
private String name = null;

@Column(name="AGE")
private int age = 0;
	
@OneToMany(targetEntity=Address_OneToMany.class)
@JoinColumn(name="PERSON_ID",nullable=false, referencedColumnName="PERSON_ID")
@Cascade(CascadeType.ALL)
private Set<Address_OneToMany> address = new HashSet<Address_OneToMany>();
省略setter,getter

address实体定义:
@Id 
@Column(name="ADDRESS_ID")
private int addressId=0;
	
@Column(name="ADDRESS_NAME")
private String addressName = null;
省略setter,getter

在client端,new两个address,再加到person的set中,最后persist这个person:
Address address1 = new Address(411,"lv shun");
		
Address address2 = new Address(101,"beijing");
		
Person person1 = new Person(210824,"father",59);
		
person1.getAddress().add(address1);
person1.getAddress().add(address2);
		
session.persist(person1);

按书上的说法,这种情况下,如果address表的外键person_id为notnull,则直接出错;如果address表的外键person_id可以为null,则先insert,再update。
但是我现在的情况是address表的外键person_id为notnull,但是却没有出错,而是先insert后update。而且insert时,person_id直接就可以取到personId,接着再用相同的值再update一次。如下:
insert 
    into
        TEST_PERSON
        (AGE, NAME, PERSON_ID) 
    values
        (?, ?, ?)
2014-12-19 14:18:29,378 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [1] as [INTEGER] - [59]
2014-12-19 14:18:29,379 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [2] as [VARCHAR] - [father]
2014-12-19 14:18:29,379 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [3] as [INTEGER] - [210824]
2014-12-19 14:18:29,478 DEBUG (org.hibernate.SQL:109) - 
    insert 
    into
        TEST_ADDRESS
        (ADDRESS_NAME, PERSON_ID, ADDRESS_ID) 
    values
        (?, ?, ?)
2014-12-19 14:18:29,478 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [1] as [VARCHAR] - [lv shun]
2014-12-19 14:18:29,478 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [2] as [INTEGER] - [210824]
2014-12-19 14:18:29,479 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [3] as [INTEGER] - [411]
2014-12-19 14:18:29,575 DEBUG (org.hibernate.SQL:109) - 
    insert 
    into
        TEST_ADDRESS
        (ADDRESS_NAME, PERSON_ID, ADDRESS_ID) 
    values
        (?, ?, ?)
2014-12-19 14:18:29,575 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [1] as [VARCHAR] - [beijing]
2014-12-19 14:18:29,575 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [2] as [INTEGER] - [210824]
2014-12-19 14:18:29,576 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [3] as [INTEGER] - [101]
2014-12-19 14:18:29,672 DEBUG (org.hibernate.SQL:109) - 
    update
        TEST_ADDRESS 
    set
        PERSON_ID=? 
    where
        ADDRESS_ID=?
2014-12-19 14:18:29,672 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [1] as [INTEGER] - [210824]
2014-12-19 14:18:29,673 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [2] as [INTEGER] - [411]
2014-12-19 14:18:29,769 DEBUG (org.hibernate.SQL:109) - 
    update
        TEST_ADDRESS 
    set
        PERSON_ID=? 
    where
        ADDRESS_ID=?
2014-12-19 14:18:29,769 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [1] as [INTEGER] - [210824]
2014-12-19 14:18:29,769 TRACE (org.hibernate.type.descriptor.sql.BasicBinder:81) - binding parameter [2] as [INTEGER] - [101]

在oracle11g上运行会出这种情况,实验环境:oracle11g, jdk1.7,ojdbc6.jar
但在mysql上却按预期般的出错,实验环境:mysql5.6,jdk7
分享到:
评论

相关推荐

    hibernate4.3.5

    总结,Hibernate 4.3.5版本是Java ORM领域的一个里程碑,它的特性增强和性能优化使得开发人员能更高效地处理数据库操作。掌握Hibernate的核心概念和使用方法,将极大地提升开发效率,使项目开发更加便捷。对于Java...

    hibernate4.3.5官方英文文档

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    hibernate-release-4.3.5

    在`hibernate-release-4.3.5.Final`中,一个关键的改进是对JPA 2.1规范的支持,这包括了新的特性如多租户、存储过程调用以及对Java 8日期时间API的支持。多租户功能允许在一个数据库实例中管理多个独立的应用数据,...

    hibernate4.3.5下载(2014年7月16日发布)

    hibernate官网提供的下载地址无法下载。。 为了方便大家,转在csdn一份。... hibernate-release-4.3.5.Final 注意: 由于CSDN限制只能上传60M的文件, 这个里面【不包含文档】,需要文档的话请到我的另一个资源中下载

    hibernate4.3.5references chm文档

    hibernate4.3.5references chm文档

    hibernate4.3.5 core chm文档

    自己整理的hibernate4.3.5 core参考文档,详细的开发文档,chm格式,看着更加方便

    Myeclipse 10.0 + Hibernate 4.3.5 连接 Oracle 11G的演示代码

    标题 "Myeclipse 10.0 + Hibernate 4.3.5 连接 Oracle 11G的演示代码" 描述的是一个整合项目,它将Myeclipse 10.0集成开发环境、Hibernate 4.3.5对象关系映射框架与Oracle 11G数据库相结合,用于演示如何在这样的...

    hibernate-release-4.3.5.Final.zip

    Hibernate 4.3.5.Final是Hibernate ORM框架的一个重要版本,它在前一版本的基础上进行了大量的优化和修复,确保了更高的性能和稳定性。"Final"的标签意味着这是该版本线的最后一个发布,通常包含了一系列的bug修复和...

    Hibernate4.3.5myFilter

    本文将深入探讨`Hibernate4.3.5myFilter`中的核心概念,包括一对多双向关联、级联保存以及过滤器功能,并结合C3P0数据库连接池的集成。 首先,我们来理解`一对多`的双向关联。在关系型数据库中,两个表之间可能存在...

    Struts2.3.6+hibernate4.3.5+Spring 4.0.5+oracle 10g的集成

    这个项目是关于将Struts2.3.6、Hibernate4.3.5、Spring 4.0.5框架与Oracle 10g数据库集成的一个实例。这个集成过程涉及到多个步骤,包括配置校验、国际化、数据导出到Excel,以及实现用户管理功能如添加、修改、删除...

    Spring 4.0.6+Hibernate 4.3.5 + Jpa+DBCP2

    Hibernate 4.3.5是该版本系列中的一个更新,提高了性能,增强了对JPA 2.1标准的支持,同时修复了一些已知问题,提供了更好的数据库平台兼容性。 Java Persistence API(JPA)是Java EE规范的一部分,它定义了一种...

    SpringMVC+Spring3.2.8+Hibernate4.3.5+分页实例

    SpringMVC+Spring3.2.8+Hibernate4.3.5带简单的分页实例,集成时使用hibernate-core-4.3.5.Final.jar时会报错, (网上说该Jar包中某个类的包路径改了,Spring找不到,所以换成了Hibernate4.2 的Core包了)这是BUG么...

    hibernate-release-4.3.5.Final jar包

    在这个专题中,我们将深入探讨Hibernate 4.3.5.Final版本,它是Hibernate发展历史中的一个重要里程碑,为开发人员提供了强大的数据持久化功能。 一、Hibernate概述 Hibernate 是Java领域中最流行的ORM框架之一,它...

    最新SSH版本框架搭建范例struts2.3.16.3+spring4.0.4+hibernate4.3.5

    目前最新版本的S2SH框架(struts2.3.16.3+spring4.0.4+hibernate4.3.5)的搭建DEMO,里面的配置齐全,xml都有配置demo,lib包下为整合的最小jar包,需要其他功能的自行添加,myeclipse项目,MVC三层都有示例class,可以直接...

    hibernate框架4.3.5.

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    hibernate4.3.5+spring4.0.6+struts2的全部jar包

    这个压缩包"hibernate4.3.5+spring4.0.6+struts2"提供了这三个框架的最新版本,适用于构建基于Java的企业级应用。以下是关于这三个框架及其整合的知识点详解: **Spring框架**(4.0.6版): 1. **依赖注入...

    hibernate-4.3.5(part2[Final])

    hibernate-release-4.3.5.Final,权限不足,分两次传

    hibernate-release-4.3.5.Final

    hibernate-release-4.3.5.Final的英文帮助文档

Global site tag (gtag.js) - Google Analytics