在分布式环境中使用不带EJB的JPA

时间:2019-05-27 14:33:00

标签: java spring jpa ejb distributed

因此,我的老板要求我寻找一种在Spring中使用JPA而不在分布式环境中使用EJB的方法(单个DB和从其上读取/写入的多个会话)。但是我很困惑。
我已经在简单的项目中使用带有@Entity批注的实体的Spring Boot和JPA,如果我正确理解了这些是EJB,是吗?
因此,现在他告诉我,他不想使用EJB,而是想知道它是否可行,难易程度,以及可以用来正确地管理同一DB上的分布式事务的东西,而没有企业Bean,据我了解,这个问题很容易自己解决。
我知道这很令人困惑,但是我不知道从哪里开始或寻找什么,这是保证ACID属性不使用EJB的最佳方法。

我已经读到,可以使用JTA中的EntityManager和UserTransaction代替EJB,以手动管理事务。在分布式环境中好吗?它的行为是什么?如何保证所有会话的正确更新?

1 个答案:

答案 0 :(得分:1)

我不太了解您的具体情况,因为您所说的是分布式环境,但是(单个DB和从其上读取/写入的多个会话)

@Entity不是EJB。

您可以使用Spring + JPA代替EJB。

部分答案:“保证ACID属性不使用EJB的最佳方法。” 是:
使用@EntityManager为您处理事务。 我将使用Controller-Service-Dao方法。像这样:

public abstract class GenericDAO  {
    protected EntityManager entityManager;

    @PersistenceContext(unitName="canvasEM") //persistence unit name defined inside persistence.xml 
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }   
}

public interface CanvasDAO {
    void newCanvas();
}

// Java map for a single DB table
@Entity
public class CanvasEntity  {

}

@Repository
public class CanvasDAOImpl extends GenericDAO implements CanvasDAO {    
    @Override
    public void newCanvas()  {
        CanvasEntity e = new CanvasEntity();
        ...
        entityManager.persist(e);   
    }
}

public interface CanvasService {
    CanvasDTO newCanvas(NewCanvasInputDTO in);
}

@Service
public class CanvasServiceImpl implements CanvasService {
    @Autowired
    private CanvasDAO canvasDAO;

    @Override
    public CanvasDTO newCanvas(){   
        return canvasDAO.newCanvas();
    }   
}

@RestController //or @Component
public class MyController{
    @Autowired
    CanvasService canvasService;

    ...
}


persistence.xml
<persistence>
    <persistence-unit name="canvasEM" ....>
</persistence>

您可以在此示例中看到如何配置JPA和Spring。可以给你一个基本的想法:https://github.com/ermalaliraj/connect4