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

Hibernate 一对多 Select delete insert

阅读更多

EbpEnterprise 企业基础表:                          一端

EbpEnterpriselanguage企业信息表:            多端

这两个表之间是 一对多的关系。

 

EbpEnterprise : 部分代码:

 

@CollectionOfElements(fetch = FetchType.EAGER)
    @JoinTable(
  name = "ebp_enterpriselanguage",
  joinColumns = { @JoinColumn(name = "enterprise_id", referencedColumnName = "id") })
 @IndexColumn(name = "idx")
 public Set<EbpEnterpriselanguage> getEels() {
  return eels;
 }
 
 public void setEels(Set<EbpEnterpriselanguage> eels) {
  this.eels = eels;
 }

这里配置一个一对多的关系。

 

EbpEnterpriselanguage : 部分代码 。

@Embeddable
public class EbpEnterpriselanguage{

 private java.lang.String locale;
 private java.lang.String artificialPerson;
 private java.lang.String name;
 private java.lang.String forShort;
 private java.lang.String profile;
 private java.lang.String profileOutline;
 private java.lang.String scope;
 private java.lang.String address;
 private java.lang.String contactPerson;

 public EbpEnterpriselanguage(){
 }
 
 @Column(name = "locale", unique = false, nullable = false, insertable = true, updatable = true, length = 10)
 public java.lang.String getLocale() {
  return this.locale;
 }
 
 public void setLocale(java.lang.String value) {
  this.locale = value;
 }
 
 @Column(name = "artificial_person", unique = false, nullable = true, insertable = true, updatable = true, length = 300)
 public java.lang.String getArtificialPerson() {
  return this.artificialPerson;
 }
 

 

 

问题是 : 我在对   EbpEnterprise(一端)  进行查询的时候(任何查询操作)   都会在 EbpEnterpriselanguage 里面执行 一条删除语句 和成 平房增长的 Insert 语句  ,导致的结果是 EbpEnterpriselanguage  表里多了好多重复的记录, 而且越查越多  。

 

产生这样的原因是什么 ,  解决方法是 什么 。  有什么办法可以不 执行  Delete和Insert 语句哪 ?

 

分享到:
评论
2 楼 nishifei 2009-03-09  
首先: 我的EbpEnterpriselanguage  这个表 里面已经有了一个自增长的 ID, 这个表是一个联合主键的表 , 另外一个主键就是一个外键 关联到 EbpEnterpirse 的ID上的一个字段。


但是我认为就是 他这个自增主键的 问题, 每次 查  为什么要执行 delete 和 insert 语句 哪, 即使是执行了 正常的情况下   是 先删除 多 表里面的 相关的记录 , 然后 加上 新 的记录 其实  内容 都是一样的, 现在 的问题是  删除的时候可能 没有删除 成功   紧接着 有执行 插入语句, 可是为什么插入的 语句的条数 是不固定的 , 如果删一条在加一条我也就忍了,



谢谢  你的回答 。
1 楼 tinyyea 2009-03-09  
hi,
我认为正确实现EbpEnterpriselanguage的hashCode和equals方法可能会有帮助。

事务在提交时检查EbpEnterprise的状态,多端的set通过hashCode和equals来判断其状态,如果没有正确实现hashcode和equals方法,这个判断会出现问题,hibernate可能认为集合中的元素是新的值对象,而之前那个状态的值对象找不到了,所以删除这些对象,然后插入新的(hibernate认为它们是新的)对象,这不像实体对象那样可能通过unsaved-value来判断。

考虑一些问题:
值对象EbpEnterpriselanguage中哪些字段是比较静态的,不变的。
值对象中的字段是否可以提取自然主键。
用这些字段去实现hashcode和equals方法会减少很多类似的Bug,但不完全能解决问题。
尝试给值对象EbpEnterpriselanguage加上一个自动生成的主键ID,hibernate判断时发现id不为null时触发update语句,而不会delete再insert!对于id为null的对象则立即插入。

希望对你帮助!

相关推荐

    hibernate与mybatis异同

    MyBatis提供了简单易用的API来实现数据库操作,例如select、insert、update、delete等。MyBatis还提供了动态SQL语句生成机制,例如使用#{name}占位符来动态生成SQL语句。 Hibernate提供了强大的一致性持久层框架,...

    数据库与Hibernate教案

    - 一对一、一对多、多对一、多对多关联映射的配置和实现,包括集合类型如List、Set、Map的使用。 -懒加载和立即加载策略,以及如何优化关联加载性能。 4. **AJAX插件应用**: - AJAX基础:理解异步JavaScript和...

    hibernate数据库通用SQL代码

    本文将详细讲解如何使用Hibernate来编写通用的数据库操作代码,包括插入(insert)、删除(delete)、更新(update)以及查询(select)方法。 1. 插入数据(insert) 插入数据的方法是通过调用`session.save()`...

    hibernate 执行原生sql的几种方式

    它支持结果集映射,包括一对一、一对多等关联关系。 ```java NativeQuery nativeQuery = session.createNativeQuery("from User", User.class); List&lt;User&gt; users = nativeQuery.list(); ``` 5. **通过`...

    springboot(4) 整合mybatis和hibernate

    在本教程中,我们将深入探讨如何在Spring Boot项目中整合MyBatis和Hibernate这两个流行的ORM框架。Spring Boot因其简化配置和快速开发的能力而备受青睐,而MyBatis和Hibernate则是Java世界里常用的持久层解决方案。...

    hibernate增删改查代码

    在IT行业中,Hibernate是一个非常...实际项目中,还可能涉及到事务管理、缓存机制、多对一、一对多等复杂关系映射,以及性能优化等方面的知识。通过不断的实践和学习,你将能够熟练运用Hibernate进行高效的数据访问。

    Hibernate学习笔记

    通过这些标签,可以创建复杂的映射关系,如一对一、一对多、多对多等。 在一对一映射中,可以通过标签来实现,主键关联映射可以是单向的也可以是双向的,还可以通过唯一外键关联来实现映射。在映射文件中,可以通过...

    Hibernate3教程

    - 如果数据库表之间存在关联,则需要在映射文件中定义这些关系,例如一对一、一对多或多对多等。 - **2.3.6 自动生成结束** - 完成以上配置后,Myeclipse会自动生成相应的POJO类和XML映射文件。 #### 三、使用...

    hibernate增删改查小例子

    在这个小例子中,我们将探讨如何设置和使用Hibernate进行基本的数据库操作:增加(Insert)、删除(Delete)、修改(Update)和查询(Select)。 首先,我们需要了解Hibernate的核心概念。Hibernate通过XML配置文件...

    常用 Hibernate 映射配置说明.doc

    `many-to-one`节点表示多对一的关系,通常涉及外键引用。 #### 8. 多对多关联 `many-to-many`节点处理多对多的复杂关联,可能需要额外的关联表。 通过以上详尽的解释,可以看出Hibernate映射配置的强大和灵活性,...

    Hibernate5用户手册中文版

    13. HQL与JPQL章节,详细说明了Hibernate查询语言(HQL)和Java持久化查询语言(JPQL)的语法、大小写敏感性、不同类型的语句(Select、Update、Delete、Insert)以及FROM子句的各种用法。还包括表达式的讲解,例如...

    struts2与hibernate整合单表增删改查(超完整)

    单表操作包括增加(Insert)、删除(Delete)、修改(Update)和查询(Select)。在Hibernate中,这些操作可以通过Session的对应方法完成,例如`save()`、`delete()`、`update()`和`load()`/`get()`。对于查询,还...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     16.4 多对一和一对一关联的检索策略  16.4.1 迫切左外连接检索(fetch属性为“join”)  16.4.2 延迟检索(lazy属性为默认值“proxy”)  16.4.3 无代理延迟检索(lazy属性为“no-proxy”)  16.4.4 立即检索...

    spring hibernate整合的底层数据操作方法

    在IT行业中,Spring和Hibernate是两个非常重要的框架,Spring是一个全面的后端开发框架,而Hibernate则是一个对象关系映射(ORM)工具,主要用于数据库操作。当我们将它们整合在一起时,可以实现强大的数据访问能力...

    Spring+Hibernate工具类所有增删改查

    例如,它们可能包括了保存(insert)、更新(update)、删除(delete)和查询(select)数据的方法,这些方法可能是基于JdbcTemplate或者HibernateTemplate实现的。 JdbcTemplate是Spring提供的一个数据库访问组件...

    hibernate增删改查事例的web工程

    是一个基于Hibernate框架的Web应用程序,旨在帮助开发者通过实际操作来理解和掌握Hibernate在数据库操作中的基本功能,包括插入(Insert)、删除(Delete)、更新(Update)和查询(Select)数据。Hibernate是Java...

    hibernate-mapping参数详解

    在 Hibernate 中,为了将 Java 对象映射到数据库表,并实现对象关系映射(ORM),开发者需要定义一系列配置属性来指导 Hibernate 如何进行转换。本文将详细解析 `hibernate-mapping` 文件中的各种关键配置项及其含义...

    hibernate4增删查改以及配置

    #### 一、Hibernate 概述与配置 Hibernate 是一个全功能的 ORM(对象关系映射)框架,用于 Java 应用程序与数据库进行交互。它提供了一个高度抽象的层,将面向对象的 Java 对象模型转换为关系型数据库中的表。在 ...

    Hibernate5 的用户手册中文版

    说明了Hibernate查询语言(HQL)和Java持久化查询语言(JPQL)的使用,包括大小写敏感性,语句类型(Select,Update,Delete,Insert),FROM子句的使用,以及如何在查询中使用表达式。 以上内容是Hibernate5用户...

    Hibernate通用数据库操作方法

    在上述代码中,我们看到了四个核心的 Hibernate 操作:插入(insert)、删除(delete)、更新(update)以及查询(select),这些都是在数据库操作中非常基础且重要的功能。 1. **插入(insert)**: `insert` ...

Global site tag (gtag.js) - Google Analytics