【问题标题】:Use JPA without EJB in a distributed environment在分布式环境中使用没有 EJB 的 JPA
【发布时间】:2019-10-13 03:32:55
【问题描述】:

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

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

【问题讨论】:

    标签: java spring jpa ejb distributed


    【解决方案1】:

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

    @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

    【讨论】:

    • 感谢您的回答。是的,我知道我写的很少,我们需要开发的网络应用程序将使用单个数据库,但不同的用户可以同时连接到它并更改数据库上的相同实体,所以我猜他是什么需要保证的是用户不会使用不一致的数据(例如更改实体并在实体已被其他人更改时提交)。所以我猜他正在寻找对实体一致性的某种检查......这是否与使用 EJB 有关?
    • EJB 使用JPA/EntityManager 进行数据库管理(事务),它为您指出的所有疑问提供保证。如果你想摆脱EJB,你可以使用Spring,或其他相同目的的框架。
    猜你喜欢
    • 2011-07-09
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2018-10-29
    • 2018-12-05
    相关资源
    最近更新 更多