Spring+JPA+Hibernate诡异问题

honeyqiuqiu 2013-04-05 09:08:34
我Spring+JPA在非java web 情况下,运行出错了。错误信息是: javax.persistence.TransactionRequiredException: Executing an update/delete query。网上我查了很久,大概就是说没事务吧。但是我数据库不一定非要事务啊。Hibernate+Spring相同一个数据库下却没任何问题。好了,说主要问题:
先给出applicationContext.xml的代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<context:component-scan base-package="org.xgj.sshtest" />

<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="sshtest_unit">
</property>
</bean>
</beans>


下面是JPA的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="sshtest_unit"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>org.xgj.sshtest.BaseEntity</class>
<class>org.xgj.sshtest.entity.UserEntity</class>
<class>org.xgj.sshtest.entity.PropertyEntity</class>



<!-- 属性配置 -->
<properties>
<!-- ==============Hibernate 连接设置================= -->
<!-- 方言 -->
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQL5Dialect" />
<!-- org.hibernate.dialect.SQLServerDialect -->
<!-- org.hibernate.dialect.MySQLDialect -->
<!-- org.hibernate.dialect.Oracle10gDialect -->

<!-- 驱动类 -->
<property name="hibernate.connection.driver_class"
value="com.mysql.jdbc.Driver" />
<!-- net.sourceforge.jtds.jdbc.Driver -->
<!-- oracle.jdbc.driver.OracleDriver -->
<!-- com.mysql.jdbc.Driver -->

<!-- URL地址 -->
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost:3306/sshtest?useUnicode=true&characterEncoding=UTF-8" />
<!-- jdbc:jtds:sqlserver://localhost:1433/sshtest; -->
<!-- oracle jdbc:oracle:thin:@localhost:1521:sshtest -->
<!-- mysql jdbc:mysql://localhost:3306/sshtest?useOldAliasMetadataBehavior=true -->

<!-- 用户名 -->
<property name="hibernate.connection.username" value="root" />

<!-- 密码 -->
<property name="hibernate.connection.password"
value="123456" />

<!-- 连接的字符编码 -->
<property name="hibernate.connection.charSet" value="UTF-8" />
<property name="hibernate.connection.characterEncoding"
value="UTF-8" />


<!-- ==============Hibernate 附加设置================= -->
<!-- create 删除以前的,从新建. create-drop 根据model类生成表,但是sessionFactory一关闭,表就自动删除
. update 最常用的属性,也根据model类生成表,即使表结构改变了,表中的行仍然存在,不会删除以前的行 validate : 只会和数据库中的表进行比较,不会创建新表,但是会插入新值 -->
<!-- <property name="hibernate.hbm2ddl.auto" value="update" /> -->

<!-- 在控制台打印SQL语句 -->
<property name="hibernate.show_sql" value="true" />

<!-- 格式化 SQL语句-->
<property name="hibernate.format_sql" value="true" />

<!-- Hiberante将为SQL产生注释,这样更利于调试-->
<property name="hibernate.use_sql_comments" value="true" />


<!-- ==============Hibernate C3P0设置================= -->
<!-- c3p0连接提供器 -->
<property name="hibernate.connection.provider_class"
value="org.hibernate.connection.C3P0ConnectionProvider" />

<!-- 最小连接数 -->
<property name="c3p0.min_size" value="5" />

<!-- 最大连接数 -->
<property name="c3p0.max_size" value="30" />

<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="c3p0.maxIdleTime" value="60" />

<!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
<property name="c3p0.timeout" value="1800" />

<!-- 最大的PreparedStatement的数量 -->
<property name="c3p0.max_statements" value="50" />

<!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒-->
<property name="c3p0.idle_test_period" value="120" />

<!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
<property name="c3p0.acquire_increment" value="1" />
<!-- 是否每次都验证连接是否可用 -->
<property name="c3p0.validate" value="false" />
</properties>



</persistence-unit>
</persistence>


然后是JAVA 代码:

public class Test {
/**
* @param args
*/
public static void main(String[] args) {
String[] configs = { "applicationContext.xml" };
ApplicationContext ctx = new ClassPathXmlApplicationContext(configs);
UserDAO userDAO = (UserDAO) ctx.getBean("userDAO");
try {
UserEntity userEntity= userDAO.get(1L); //这里没问题
System.out.println(userEntity.getUsername());
userDAO.getEntityManager().createQuery("delete from UserEntity").executeUpdate(); //这里出问题了
} catch (SQLException e) {
e.printStackTrace();
}
}

}

userDAO其实里面就封装了一个EntityManager。这样注入EntityManager到UserDAO的

/**
* JPA实体管理器
*/
@PersistenceContext
private EntityManager em;



我的问题是上面为什么出现 javax.persistence.TransactionRequiredException: Executing an update/delete query 异常呢?我TMD不用事务不行么?纯的hibernate就没这个问题。。 大家帮一下
...全文
168 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
jpa中,在增删改查四个操作,只有查是不用开启事务的,而对于其它三个,因为你要修改数据库数据,所以一定要先开启事务,如果修改事务失败,数据自动回滚到开启事务之前的状态。你这说的明显没有开启事务啊
tangduDream 2013-10-13
  • 打赏
  • 举报
回复
TMD我也遇到这个问题了 狗日的。。搞了一下午无果。 看官方说是事务要加到dao层。这部搞笑么。。 加service 不是,,我去。 搞不定了。。操蛋。。
u010177826 2013-04-05
  • 打赏
  • 举报
回复
期待楼主的问题早日被解决

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧