一起使用Spring和EJB事务

一起使用Spring和EJB事务,spring,spring-boot,jpa,transactions,ejb-3.0,Spring,Spring Boot,Jpa,Transactions,Ejb 3.0,我在尝试将实体添加到数据库时出错。我已经提到了。但它没有太多关于我的问题的信息 我有一个EJBJAR,用于管理获取、保存和更新实体 这是我的远程ejb @Remote public abstract interface DatalayerService{ public abstract void add(Object object) } 这是我的建议 @TransactionManagement(TransactionManagementType.CONTAINER) @Transact

我在尝试将实体添加到数据库时出错。我已经提到了。但它没有太多关于我的问题的信息

我有一个EJBJAR,用于管理获取、保存和更新实体

这是我的远程ejb

@Remote
public abstract interface DatalayerService{
   public abstract void add(Object object)
}
这是我的建议

@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class DatalayerServiceImpl implements DatalayerService{
  @PersistenceContext(name="myPersistenceUnit")
   EntityManager em = null;

  @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void add(Object object) throws FatalException{
        try {
            em.persist(object);
        }
        catch (Throwable e){
            throw manageDatalayerError(e);
        }
        finally {

        }
    }
}
我正在尝试在我的应用程序中使用上述ejb

(一)

2) 休息服务

@RestController
public class HomeEndPoint{

    @Autowired
    private IUserService iUserService;

    @GetMapping("/createUser")
    @Transactional(rollbackFor = {ServiceExpectedException.class,FatalException.class,MandatoryParameterMissingFatalException.class})
    public void createUser() throws FatalException,ServiceExpectedException{
        iUserService.createUser();
    }

}
3) 用户服务及其实现

public interface IUserService{
   public void createUser() throws FatalException;
}

    @Service
@Transactional(rollbackFor = {ServiceExpectedException.class,FatalException.class,MandatoryParameterMissingFatalException.class})
public class UserServiceImpl implements IUserService{
     @Autowired
    private DatalayerGenericService datalayerGenericService;

     @Override
    public void createUser() throws FatalException,ServiceExpectedException{
     Team team = new Team(simpleContextService);
        team.setGroupName("MyTeam");
        team.setStoreId(100);
        // Team
        datalayerGenericService.add(team);
        Log.info(this,"add team ");
        // Build user1
        datalayerGenericService.add(user1);
        Log.info(this,"############################# Added User1 ######################################");
        // Build user2
        datalayerGenericService.add(user2);
        Log.info(this,"############################# Added User2 ######################################");

}
}
我尝试使用url运行rest服务

http://localhost:6180/SpringBootDatalayer/createUser
我得到以下例外

信息:(com.edifixio.springboot.service.impl.UserServiceImpl)

#######################teamOid 20信息:(com.edifixio.springboot.service.impl.UserServiceImpl) #######################3月3日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日(com.edifixio.springboot.service.impl.UserServiceImpl) #######################摩摩摩摩摩摩摩摩摩托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托发布日期:http-nio-6180-exec-1:AbstractBatchImpl.release:hh000010:batch it still发布时 包含JDBC语句2018-03-27 16:28:17683:错误: http-nio-6180-exec-1:BatchingBatch.performExecution:HH000315: 执行批处理时出现异常[java.sql.BatchUpdateException:批处理条目 0插入团队(创建时间戳、项目组名称、, 上次更新时间戳、存储ID、ID)值('2018-3-27 16:28:17.447000+5:30:0,MMA_测试,2018-3-27 16:28:17.503000 +5:30:0',100,21)已中止。请调用getNextException查看原因。],SQL:insert into TEAM(创建时间戳,项目组名称, 上次更新时间戳,存储(ID,ID)值(?,,,?,?)

从异常中可以看出,它使用datalayerGenericService创建了团队、user1和user2。但尝试再次执行以给出AbstractBatchImpl.release:hh000010:在批处理的发布时,它仍然包含JDBC语句

以下是我得到的一个例外:

java.sql.BatchUpdateException:批处理条目1插入到团队中 (创建时间戳、项目组名称、上次更新时间戳、, 存储(ID,ID)值('2018-3-29 12:9:26.611000+5:30:0','MMA_测试', “2018-3-29 12:9:26.836000+5:30:0',10023)被中止。呼叫 getNextException以查看原因

我如何解决这个问题?为什么查询执行两次

如果EJB方法中发生任何异常,它应该回滚事务。但事实并非如此

注意:如果我从服务中删除@Transactional annotation,它可以正常工作。
我正在使用TomEE 7.0.2服务器。

我是如何解决此问题的

我被误解为这里涉及EJB的东西 但是@M.Deinum向我澄清,这里不涉及EJB,不管我添加了那些注释,这意味着我的DatalayerServiceImpl只是一个SpringBean。 添加所有这些接口和注释只会增加代码的复杂性和开销,而这些代码被Spring默默忽略(除了Spring支持的事务性代码)

说到我的问题,我已经在用户类中声明了团队

@ManyToOne(cascade={CascadeType.PERSIST},fetch=FetchType.LAZY)
@JoinColumn(name="TEAM_ID",nullable=false)
@JsonBackReference
private Team team;
创建用户时,我将创建的团队实例引用到Users类

@ManyToOne(cascade={CascadeType.PERSIST},fetch=FetchType.LAZY)
@JoinColumn(name="TEAM_ID",nullable=false)
@JsonBackReference
private Team team;
我在做什么

Team team = new Team(simpleContextService);
team.setGroupName("MMA_TEST");
team.setStoreId(100);
// Team
Long teamOid = datalayerGenericService.updateWithId(team);

Users user1 = new Users(simpleContextService);
...Set other fields
user1.setTeam(team);
当团队声明为persistendinterusers时,它试图在持久化用户时插入团队


因此,我已更改为合并。所以它工作得很好。

从技术上讲,您既不插入用户也不插入团队。您可以将它们持久化到PersistenceContext。当代码离开时

@Transactional(rollbackFor = {ServiceExpectedException.class,FatalException.class,MandatoryParameterMissingFatalException.class})
    public void createUser()
必须提交、刷新或关闭会话,只要您已按要求标记。它在第一次插入(团队)时失败,因为您没有上面列出的任何内容


是的,您在这里使用的是EJB。事实上,您使用的是Hibernate,只有@Transactional as Spring服务注释在这里有效。

您已将事务指定为
不受支持
,因此不会启动任何事务。改用
必需的
。此外,这里没有涉及EJB内容,不管您添加了那些注释。Spring不会启动EJB容器,也不会启动EJB容器,因此它将只是一个普通的Spring bean。所以这里涉及EJB的东西。不,这里没有。。。您只使用了一个默认的事务注释,而不是一个EJB。添加所有这些接口和注释只会增加代码的复杂性和开销,而这些代码被Spring默默忽略(除了Spring支持的
事务性
)。因此,如果我很好地理解您的评论,您是说DatalayerServiceImpl不是EJB?正确,它只是一个Springbean。Spring不是EJB容器。。。