最近在使用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。又发现这个问题的,告诉我啊!
分享到:
相关推荐
- **设计模式**:考虑使用模板方法模式或者策略模式,将通用的数据库操作抽象出来,使得`HibernateDao.java`更具有复用性和灵活性。 总结,`HibernateDao.java`是Hibernate框架在实际项目中的重要实现,它封装了...
使用Hibernate DAO生成工具,开发者可以自动生成与数据库表对应的DAO接口和实现类,这些类通常包含增删查改的基本方法。例如,对于一个名为`User`的表,工具会生成`UserDAO`接口和`UserDAOImpl`实现类,其中包含`...
HibernateDao 是一种基于 Hibernate ORM(对象关系映射)框架的通用数据访问对象,它简化了对数据库的操作,提供了更高级别的抽象,使开发者能够更加专注于业务逻辑而不是底层的数据操作。在Java开发中,Hibernate...
3. 创建Dao接口和实现类:定义Dao接口,其中包含需要进行事务管理的数据库操作方法。然后实现这个接口,使用Hibernate的Session进行实际的数据库操作。 4. 使用Spring的ProxyFactoryBean或AopProxy来创建Dao的代理...
创建一个DAO接口,定义所有需要的方法,然后创建一个实现该接口的类,如`UserDaoImpl`,在这个实现类中使用Hibernate API完成实际的数据库操作。 5. **泛型DAO**: 为了进一步提高代码的复用性,可以使用泛型来...
HibernateDAO(Data Access Object)主要负责数据库的读写操作,它封装了对Hibernate Session的操作,降低了业务层与数据库的直接交互,提高了代码的可维护性和可测试性。DAO设计模式是将数据库操作隔离出来,使得...
本篇将深入探讨如何在Hibernate中实现数据库操作而无需使用注解,以及如何解决在Hibernate 3中遇到的连接SQL的常见问题。 首先,让我们了解在Hibernate中免注解实现数据库操作的基本步骤: 1. **配置Hibernate**: ...
未来 Hibernate是一个强大的Java持久化框架...以上各点提供了实现这一目标的基础,但实际项目中可能还需要解决更多特定于数据库的问题。通过良好的设计和测试,可以确保Hibernate应用程序在多种数据库环境下稳定运行。
**Hibernate原生通用DAO**是基于Hibernate框架设计的一种简化数据访问操作的方式,它模仿了Spring框架中的`HibernateTemplate`类,旨在提供一个简单易用的DAO(Data Access Object)层,方便开发人员进行数据库操作...
为了解决这个问题,"Hibernate DAO生成器"应运而生,它自动化了这个过程,大大提高了开发效率。 **一、什么是DAO** 数据访问对象(Data Access Object)是一种设计模式,主要用于封装对数据库的访问,将业务逻辑与...
- **保存/插入**:使用`Session`的`save()`或`saveOrUpdate()`方法来保存新实体到数据库。 - **更新**:对已存在的实体进行修改后,调用`Session`的`update()`方法来更新数据库。 - **删除**:通过`Session`的`...
这个接口通常包含增删改查等基本方法,例如`save()`, `delete()`, `update()`, `findById()`, `findAll()`等。然后,针对每一种具体的数据实体,可以创建一个实现了`BaseDao<T>`接口的DAO类,如`UserDaoImpl`,并在...
JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。 在本压缩包中,我们找到了用于集成Hibernate的jar包,Hibernate是一...
**hibernate通用DAO(Data Access Object)**是软件开发中的一个重要概念,它主要用于数据库操作的抽象,使得业务逻辑层可以无需关注具体的SQL语句,从而实现数据访问的解耦。在Java EE应用中,Hibernate作为一款...
- **作用**:提供了一个简单的文档说明,用于描述通用Hibernate DAO的设计思路和实现方法。 #### 三、标签:DAO - **含义**:DAO是Data Access Object的缩写,数据访问对象,是一种常用的设计模式。在本例中,特指...
例如,通过Session的save()方法可以保存新对象到数据库,update()方法更新已存在的对象,delete()方法删除对象,而find()或get()方法用于根据主键检索对象。此外,Criteria和HQL提供了更强大的查询功能,支持复杂的...
例如,`save()`方法用于保存对象到数据库,`update()`方法用于更新对象,`delete()`方法用于删除对象,而`find()`方法则用于根据特定条件查找对象。 **存储过程**是预编译的SQL语句集合,它可以在数据库服务器端...
例如,通过Session对象的save()方法保存新的对象,get()方法获取对象,update()方法更新对象,delete()方法删除对象。 10. **优化和最佳实践**: 虽然自动生成的代码可以快速起步,但通常需要根据项目需求进行调整...