Используйте JPA без EJB в распределенной среде - PullRequest
0 голосов
/ 27 мая 2019

Итак, мой начальник попросил меня найти способ использовать JPA в Spring без использования EJB в распределенной среде (одна БД и несколько сессий чтения / записи из нее). Но у меня много путаницы.
Я использовал Spring Boot и JPA, используя сущности с аннотацией @Entity в простых проектах, и если я правильно понял, это EJB, верно?
Итак, теперь он сказал мне, что не хочет использовать EJB-компоненты, но выясняет, возможно ли это, насколько сложно / легко и что можно использовать для правильного управления распределенными транзакциями в одной и той же БД, не имея корпоративных компонентов, которые из того, что я понял, легко решить эту проблему самостоятельно.
Я знаю, что это сбивает с толку, но я не знаю, с чего начать и что искать, и какой лучший способ гарантировать свойства ACID, не использующие EJB.

Я читал, что вместо EJB можно использовать EntityManager и UserTransaction из JTA для управления транзакциями вручную. Это хорошо в распределенной среде? Каково было бы его поведение? Как можно гарантировать правильное обновление для всех сеансов?

1 Ответ

2 голосов
/ 27 мая 2019

Я не очень хорошо понимаю ваш конкретный случай, потому что вы говорите о распределенной среде, но потом (одна БД и несколько сеансов чтения / записи из / на нее)

@ Сущность не является EJB.

Вы можете использовать Spring + JPA вместо EJB.

Ответ от части: "лучший способ гарантировать свойства ACID, не использующие EJB." :
Использование @EntityManager, который обрабатывает для вас транзакции. Я бы использовал подход «Контроллер-Сервис-Дао». Примерно так:

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

...