一个业务需求,需要在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中的注释知识点详解 #### 一、EJB注解概述 EJB(Enterprise JavaBeans)是一种Java EE服务器端应用模型,用于构建可移植的企业级应用。EJB 3.0引入了大量的注解(annotation),使得开发变得更加简单直观。...
软件架构: EJB3.0 + Struts1.3 + Spring2.0 + JPA 应用服务器: Jboss5.1 数据库用: Oracle9i 部署前将 demo-service.xml和oracle-ds.xml copy到jboss deploy目录下,配置到你的环境下即可 -- Create sequence ...
`@EJB`注释用于在Java类中注入EJB组件。这是一个非常常用的注释,它可以帮助开发者在不使用XML配置的情况下进行EJB的依赖注入。 **常用属性:** - `beanName`: 指定EJB的类名(不带包名)。例如: ```java @EJB...
- `@EJB`注释用于在组件中注入EJB服务。它允许你通过指定beanName或mappedName来引用EJB。例如: ```java @EJB(beanName="A") IA a; ``` - 如果只有一个实现类,通常可以省略beanName。`mappedName`属性用于...
但在EJB 3.0中,实体Bean的编写更加直观,更接近于普通Java Bean的编程模式。 实体Bean在EJB 3.0中主要依赖于注解进行配置,这些注解使得开发者无需编写大量的XML配置文件,提高了开发效率。例如,`@Entity`注解...
在EJB 3.0中,`@Id`注解用于标识实体类中的某个属性作为主键。该注解可以应用于字段或getter方法上。 **示例:** ```java @Entity public class User { @Id private Long id; // ... } ``` #### 2. `@...
- **事务范围**:持久化上下文可以在整个事务范围内共享,也可以在每个请求中单独管理。 ### EntityManager (EM) #### 7.1 一般规则 - **EntityManager用途**:用于执行持久化操作,如保存、更新、删除实体对象。...
在EJB 3.0中开发SessionBean、MessageDriven-Bean** - EJB 3.0支持注解来简化配置。 **3. JPA (Java Persistence API)** - 一种Java平台上的标准持久化层API,用于简化持久化层的开发。 **4. hibernate和entity中...
无论是在简单的Java客户端程序还是在Servlet/JSP驱动的Web应用,甚至是复杂的EJB环境中,Hibernate都能有效地处理数据持久化。 **核心接口** 1. **Session接口**:Session是与数据库交互的主要接口,用于执行CRUD...
- **主键生成策略**:在Hibernate XML映射文件中,主键生成策略(如`increment`、`identity`、`sequence`等)可通过`<id>`标签的`generator-class`属性指定。 - **实体类映射**:使用Hibernate的标注(annotations)...
- Apache OJB、TopLink、iBatis(MyBatis)、EJB CMP等也都是常见的ORM框架,但Hibernate以其易用性和强大的功能在业界得到了广泛的应用。 #### 二、为什么需要Hibernate? 1. **减少代码量**:通过ORM技术,可以...
- **应用场景**:广泛应用于金融、电信、制造等行业,特别是在大型企业和组织中作为核心业务系统的支撑平台。 **2.2 数据库体系结构** - **组成部分**:主要包括实例(Instance)和数据文件两大部分。 - **实例**...