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