`
nishifei
  • 浏览: 15010 次
  • 性别: 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教案

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

    hibernate数据库通用SQL代码

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

    hibernate与mybatis异同

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

    hibernate 执行原生sql的几种方式

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

    hibernate增删改查代码

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

    springboot(4) 整合mybatis和hibernate

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

    hibernate增删改查小例子

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

    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通用数据库操作方法

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

    struts2 + hibernate3 + spring3 ssh 用户的增删改查

    4. Hibernate DAO:使用Hibernate API执行SQL操作,如保存(insert)、更新(update)、删除(delete)和查询(select)用户。 5. Spring管理:使用@Autowired注解自动注入Service和DAO,同时通过@Transactional注解...

    jsf+hibernate编写的行政执法管理系统

    增删查改,即添加(INSERT)、删除(DELETE)、查询(SELECT)和修改(UPDATE)操作,是任何数据库驱动应用的基础。通过Hibernate的ORM机制,开发者可以方便地实现这些操作,无需编写大量的SQL语句。例如,通过定义...

    Hibernate注释大全收藏

    这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....

    Hibernate实现Oracle中数据的增删改查

    在Java开发中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是繁琐的数据访问代码。本篇将详细介绍如何使用Hibernate在Oracle数据库中实现数据的增删改查操作。...

    hibernate注解功能模拟

    - 拼装SQL:根据注解信息,构建符合数据库操作的SQL语句,如SELECT、INSERT、UPDATE或DELETE。 - 执行数据库操作:使用JDBC API或其他数据库连接库执行SQL语句。 在这个过程中,你还需要考虑一些实际问题,如事务...

    hibernate的一个简单的例子

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者将Java对象与数据库中的表进行映射,简化了数据库操作。通过使用Hibernate,开发者可以避免编写大量的SQL语句,提高开发效率,同时也使得代码更加可读...

Global site tag (gtag.js) - Google Analytics