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

hibernate dao save不写入数据库解决方法

阅读更多

最近在使用MyEclipse进行项目开发的时侯,发现使用其自带的Hibernate 反向工程生成的dao文件的save方法不能入库:

解决方法如下:

1:首先是主键自增问题:

一般我们常用的主键自增主要是一下几种:

increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。 
identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。
sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。
native
Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

详细见:http://fengzhiyu-sh.iteye.com/blog/183393即可

主要是要使自己的数据库要与符合对应的主键自增方式!!!一般改为“native”是不会出错的!

2:没有使用事务管理模式,仔细看myEclipse的反向工程生成的dao的save方法:

         public void save(EtpDynamicValue transientInstance) {
         log.debug("saving EtpDynamicValue instance");

         try {
   
                 getSession().save(transientInstance);

                 log.debug("save successful");
         } catch (RuntimeException re) {
                 log.error("save failed", re);
                 throw re;
         }
        }

并不能说这个没有添加事务管理模式,只不过你这么写他有的时候灵有的时侯不灵,那我们改为显示的提交事务(如下)就成了!!!我也觉得很奇怪啊!!!

        public void save(EtpDynamicValue transientInstance) {
         log.debug("saving EtpDynamicValue instance");
         Transaction tran=getSession().beginTransaction();
         try {
   
                 getSession().save(transientInstance);

                 log.debug("save successful");
         } catch (RuntimeException re) {
                 log.error("save failed", re);
                 throw re;
         }
         tran.commit();
         getSession().flush();
         getSession().close();
 }

以上蓝色为添加的部分!!!

 

对不住,我在更改一下,蓝色部分不是所有的都是必须的,只要有

 Transaction tran=getSession().beginTransaction();
tran.commit();
剩下的

getSession().flush(); 

getSession().close();
我感觉有点多余,而且在我的项目里面,flush和close用多了,会save数据两次……我也不知道为什么,只要提交事务Transaction 就行了,不用老关session。又发现这个问题的,告诉我啊!

分享到:
评论
3 楼 zxl823 2009-11-06  
我也出这种问题啊,这个方法好用!
2 楼 easonfans 2009-09-15  
不知道我这么回复你,你看的到么?
恩,我那个项目是用MyEclipse开发的,使用MyEclipse带的反向工程工具生成的dao就存在上述问题,我不知道用HibernateSynchronizer生成的dao有没有这个问题。
最近要写毕业论文,没怎么弄这块。感觉应该在修改.cfg配置文件应该也是可行的。
我回来试试,会尽快通知你。
1 楼 damoqiongqiu 2009-09-15  
你说的这个问题我遇到过,也是这么解决的。不过这么做有点烦啊,比如有可能我生成了百十来个DAO,那就惨了。你发现更好的解决办法没有?请多指教。

相关推荐

    HibernateDao.java

    - **设计模式**:考虑使用模板方法模式或者策略模式,将通用的数据库操作抽象出来,使得`HibernateDao.java`更具有复用性和灵活性。 总结,`HibernateDao.java`是Hibernate框架在实际项目中的重要实现,它封装了...

    hibernate dao 生成工具

    使用Hibernate DAO生成工具,开发者可以自动生成与数据库表对应的DAO接口和实现类,这些类通常包含增删查改的基本方法。例如,对于一个名为`User`的表,工具会生成`UserDAO`接口和`UserDAOImpl`实现类,其中包含`...

    HibernateDao 通用

    HibernateDao 是一种基于 Hibernate ORM(对象关系映射)框架的通用数据访问对象,它简化了对数据库的操作,提供了更高级别的抽象,使开发者能够更加专注于业务逻辑而不是底层的数据操作。在Java开发中,Hibernate...

    使用代理实现Hibernate Dao层自动事务

    3. 创建Dao接口和实现类:定义Dao接口,其中包含需要进行事务管理的数据库操作方法。然后实现这个接口,使用Hibernate的Session进行实际的数据库操作。 4. 使用Spring的ProxyFactoryBean或AopProxy来创建Dao的代理...

    Hibernate封装dao层

    创建一个DAO接口,定义所有需要的方法,然后创建一个实现该接口的类,如`UserDaoImpl`,在这个实现类中使用Hibernate API完成实际的数据库操作。 5. **泛型DAO**: 为了进一步提高代码的复用性,可以使用泛型来...

    HibernateDAO的写法

    HibernateDAO(Data Access Object)主要负责数据库的读写操作,它封装了对Hibernate Session的操作,降低了业务层与数据库的直接交互,提高了代码的可维护性和可测试性。DAO设计模式是将数据库操作隔离出来,使得...

    HIbernate免注解实现操作数据库 及Hibernate3连接SQL的BUG解决办法

    本篇将深入探讨如何在Hibernate中实现数据库操作而无需使用注解,以及如何解决在Hibernate 3中遇到的连接SQL的常见问题。 首先,让我们了解在Hibernate中免注解实现数据库操作的基本步骤: 1. **配置Hibernate**: ...

    Hibernate 多数据库支持解决方案

    未来 Hibernate是一个强大的Java持久化框架...以上各点提供了实现这一目标的基础,但实际项目中可能还需要解决更多特定于数据库的问题。通过良好的设计和测试,可以确保Hibernate应用程序在多种数据库环境下稳定运行。

    Hibernate 原生通用DAO

    **Hibernate原生通用DAO**是基于Hibernate框架设计的一种简化数据访问操作的方式,它模仿了Spring框架中的`HibernateTemplate`类,旨在提供一个简单易用的DAO(Data Access Object)层,方便开发人员进行数据库操作...

    Hibernate DAO生成器

    为了解决这个问题,"Hibernate DAO生成器"应运而生,它自动化了这个过程,大大提高了开发效率。 **一、什么是DAO** 数据访问对象(Data Access Object)是一种设计模式,主要用于封装对数据库的访问,将业务逻辑与...

    hibernate框架下对oracle数据库操作所需jar包.zip

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了与数据库交互的过程,使得开发者可以使用面向对象的方式来操作数据库。对于Oracle数据库的支持,Hibernate提供了专门的驱动和配置,使得...

    国产神通数据库用到的jdbc驱动包、集成Hibernate用到的jar包

    JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。 在本压缩包中,我们找到了用于集成Hibernate的jar包,Hibernate是一...

    hibernate数据库相关操作步骤

    - **保存/插入**:使用`Session`的`save()`或`saveOrUpdate()`方法来保存新实体到数据库。 - **更新**:对已存在的实体进行修改后,调用`Session`的`update()`方法来更新数据库。 - **删除**:通过`Session`的`...

    Hibernate_通用DAO模式,一个写好的dao层

    这个接口通常包含增删改查等基本方法,例如`save()`, `delete()`, `update()`, `findById()`, `findAll()`等。然后,针对每一种具体的数据实体,可以创建一个实现了`BaseDao<T>`接口的DAO类,如`UserDaoImpl`,并在...

    hibernate通用dao

    **hibernate通用DAO(Data Access Object)**是软件开发中的一个重要概念,它主要用于数据库操作的抽象,使得业务逻辑层可以无需关注具体的SQL语句,从而实现数据访问的解耦。在Java EE应用中,Hibernate作为一款...

    一个通用的Hibernate DAO

    - **作用**:提供了一个简单的文档说明,用于描述通用Hibernate DAO的设计思路和实现方法。 #### 三、标签:DAO - **含义**:DAO是Data Access Object的缩写,数据访问对象,是一种常用的设计模式。在本例中,特指...

    Hibernate 基于持久层框架的DAO模式应用

    例如,通过Session的save()方法可以保存新对象到数据库,update()方法更新已存在的对象,delete()方法删除对象,而find()或get()方法用于根据主键检索对象。此外,Criteria和HQL提供了更强大的查询功能,支持复杂的...

    Hibernate中的DAO模式

    例如,`save()`方法用于保存对象到数据库,`update()`方法用于更新对象,`delete()`方法用于删除对象,而`find()`方法则用于根据特定条件查找对象。 **存储过程**是预编译的SQL语句集合,它可以在数据库服务器端...

Global site tag (gtag.js) - Google Analytics