`
duyangsss
  • 浏览: 127408 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

在EJB中执行CREATE SEQUENCE

 
阅读更多
一个业务需求,需要在EJB服务中执行DDL语句创建序列号:

 CREATE SEQUENCE sequence_t_TestCategory INCREMENT BY 2 START WITH 10 MAXVALUE 999999999

我在一个EJB服务方法中获取数据源,通用JDBC执行如下:
	StringBuilder sb = new StringBuilder();
		sb.append("CREATE SEQUENCE ");
		sb.append("sequence_t_").append(this.runningNumber.getCategory());
		sb.append(" INCREMENT BY ").append(this.step);
		sb.append(" START WITH ").append(this.initValue);
		sb.append(" MAXVALUE ").append(maxVlue);
		LogUtils.getSingleton().info("流水号生成sequence : " + sb.toString());
		sqlService.updateBySql(sb.toString(), sessionId);

但执行总是报原生SQL语句执行异常.
java.sql.SQLSyntaxErrorException: ORA-02089: COMMIT 不允许在附属会话中

后面查资料,查出问题的原因是,执行DDL创建语句的时候,会默认添加COMMIT做提交。
而EJB中默认是有事务控制的,在有事务控制的EJB服务中是不允许做手动事务提交的,所以的办法就是将注入的SQL执行的服务方法申明为不参加事务控制,具体代码如下:
@Local(NonTransactionSqlServiceLocal.class)
@Remote(NonTransactionSqlServiceRemote.class)
@Stateless(mappedName="NonTransactionSqlService", name="NonTransactionSqlServiceBean")
@TransactionAttribute(TransactionAttributeType.NEVER)
public class NonTransactionSqlServiceBean extends AbstractSqlService {
	
	@Resource(mappedName = "jdbc/going")
	private DataSource dataSource;

	@Override
	public DataSource getDataSource() {
		return dataSource;
	}
	
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

}

这个在执行DDL的EJB中,注入NonTransactionSqlServiceBean来执行DDL语句就不会有问题了。
分享到:
评论

相关推荐

    EJB中的注释.pdf

    ### EJB中的注释知识点详解 #### 一、EJB注解概述 EJB(Enterprise JavaBeans)是一种Java EE服务器端应用模型,用于构建可移植的企业级应用。EJB 3.0引入了大量的注解(annotation),使得开发变得更加简单直观。...

    EJB3.0 + Struts1.3 + Spring2.0 + JPA

    软件架构: EJB3.0 + Struts1.3 + Spring2.0 + JPA 应用服务器: Jboss5.1 数据库用: Oracle9i 部署前将 demo-service.xml和oracle-ds.xml copy到jboss deploy目录下,配置到你的环境下即可 -- Create sequence ...

    EJB 注释精解(pdf版)

    `@EJB`注释用于在Java类中注入EJB组件。这是一个非常常用的注释,它可以帮助开发者在不使用XML配置的情况下进行EJB的依赖注入。 **常用属性:** - `beanName`: 指定EJB的类名(不带包名)。例如: ```java @EJB...

    个人整理的EJB3中的注释

    - `@EJB`注释用于在组件中注入EJB服务。它允许你通过指定beanName或mappedName来引用EJB。例如: ```java @EJB(beanName="A") IA a; ``` - 如果只有一个实现类,通常可以省略beanName。`mappedName`属性用于...

    EJB 3.0学习之实体Bean

    但在EJB 3.0中,实体Bean的编写更加直观,更接近于普通Java Bean的编程模式。 实体Bean在EJB 3.0中主要依赖于注解进行配置,这些注解使得开发者无需编写大量的XML配置文件,提高了开发效率。例如,`@Entity`注解...

    ejb3.0 注解 其中一部分

    在EJB 3.0中,`@Id`注解用于标识实体类中的某个属性作为主键。该注解可以应用于字段或getter方法上。 **示例:** ```java @Entity public class User { @Id private Long id; // ... } ``` #### 2. `@...

    SCBCD_NOTES_JIAFAN

    - **事务范围**:持久化上下文可以在整个事务范围内共享,也可以在每个请求中单独管理。 ### EntityManager (EM) #### 7.1 一般规则 - **EntityManager用途**:用于执行持久化操作,如保存、更新、删除实体对象。...

    J2EE课程总结

    在EJB 3.0中开发SessionBean、MessageDriven-Bean** - EJB 3.0支持注解来简化配置。 **3. JPA (Java Persistence API)** - 一种Java平台上的标准持久化层API,用于简化持久化层的开发。 **4. hibernate和entity中...

    hibernate开放源代码的对象关系映射框架详解

    无论是在简单的Java客户端程序还是在Servlet/JSP驱动的Web应用,甚至是复杂的EJB环境中,Hibernate都能有效地处理数据持久化。 **核心接口** 1. **Session接口**:Session是与数据库交互的主要接口,用于执行CRUD...

    J2EE考试复习试题_struts2_spring_hibernate.doc

    - **主键生成策略**:在Hibernate XML映射文件中,主键生成策略(如`increment`、`identity`、`sequence`等)可通过`<id>`标签的`generator-class`属性指定。 - **实体类映射**:使用Hibernate的标注(annotations)...

    韩顺平hibernate笔记

    - Apache OJB、TopLink、iBatis(MyBatis)、EJB CMP等也都是常见的ORM框架,但Hibernate以其易用性和强大的功能在业界得到了广泛的应用。 #### 二、为什么需要Hibernate? 1. **减少代码量**:通过ORM技术,可以...

    oracle入门系列.docx

    - **应用场景**:广泛应用于金融、电信、制造等行业,特别是在大型企业和组织中作为核心业务系统的支撑平台。 **2.2 数据库体系结构** - **组成部分**:主要包括实例(Instance)和数据文件两大部分。 - **实例**...

Global site tag (gtag.js) - Google Analytics