У меня есть объекты JPA, и мне нужно выполнять с ними логику. До сих пор эту работу выполнял огромный класс статической базы данных. Это уродливо, потому что каждый метод общедоступного интерфейса имел частный эквивалент, который использовал EntityManager для выполнения транзакций. Но я мог бы решить и это, имея статический em! Однако мне интересно, является ли это подходящим дизайном, тем более что класс отвечает за многие вещи. Неудивительно, что код, который я нашел в Интернете для реальных проектов, было нелегко понять (я мог бы также остаться со своим кодом). Код здесь легко понять, хотя, может быть, слишком обобщенно? Во всяком случае, поверх JDBC. Тем не менее, проницательно, зачем использовать фабрики и синглтоны для DAO?
Я думал об однотонном экземпляре em следующим образом:
private static final Map<String, EntityManager> ems = new HashMap<String, EntityManager>();
private final EntityManager em;
private final EntityManagerFactory emf;
public void beginTransaction() {
em.getTransaction().begin();
}
public void commitTransaction() {
em.getTransaction().commit();
}
public Database(final String persistenceUnitName) {
if(ems.containsKey(persistenceUnitName)){
em = ems.get(persistenceUnitName);
}else{
ems.put(persistenceUnitName, em = Persistence.createEntityManagerFactory(persistenceUnitName).createEntityManager());
}
emf = em.getEntityManagerFactory();
this.persistenceUnitName = persistenceUnitName;
}
Таким образом, создание экземпляров является стандартным, но при этом сохраняется singleton Connection/EntityManager. С другой стороны, я задавался вопросом, была ли вообще необходимость в одноэлементных ems? Преимущество заключается в том, что с несколькими ems у меня возникают проблемы с блокировкой (без использования em.lock()).
Любая обратная связь? Любой реальный или учебный код, который демонстрирует DAO с JPA2 и eclipselink?