Technology(Java EE 6 with Glassfish 3.1, Netbeans 7.0)
У меня есть клиент приложения, который обращается к БД через JPA. Нет EJB
участвует. Теперь мне нужно добавить веб-интерфейс для этого приложения-клиента. Поэтому я выберу JSF 2.x
. У меня есть некоторые опасения по поводу дизайна здесь, и я надеюсь, что сообщество поможет мне. Таким образом, благодаря BalusC я могу использовать JPA в автономном клиентском приложении , указав transaction-type=RESOURCE_LOCAL
в файле persistence.xml. Ниже приведены демонстрации:
РЕДАКТИРОВАТЬ приведенные ниже коды были отредактированы на основе предложения BalusC
Вот мой клиент приложения main
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("CoreInPU");
EntityManager em = emf.createEntityManager();
EntityDAO entityDAOClient = new EntityDAOClient(em);
Main pgm = new Main();
try {
process(entityDAOClient);
} catch (Exception e) {
logger.fatal("", e);
}finally{
em.close();
emf.close();
}
}
public void process(EntityDAO entityDAO){
validatePDF(List<pdfFiles>);
processPDF(List<pdfFiles>, entityDAO);
createPrintJob(List<pdfFiles>, entityDAO);
}
public void processPDF(List<pdfFiles>, EntityDAO entityDAO){
for(File file : pdfFiles){
entityDAO.create(file);
}
}
Вот мой DAO
интерфейсный класс в моем App Client
public interface EntityDAO {
public <T> T create(T t);
public <T> T find(Class<T> type, Object id);
public List findWithNamedQuery(String queryName);
public List findWithNamedQuery(String queryName, int resultLimit);
}
Вот клиент приложения DAO
public class EntityDAOClient implements EntityDAO {
private EntityManager em;
private static Logger logger = Logger.getLogger(EntityDAOClient.class);
public EntityDAOClient(EntityManager em) {
this.em = em;
}
@Override
public <T> T create(T t){
em.getTransaction().begin();
em.persist(t);
em.getTransaction().commit();
return t;
}
@Override
public <T> T find(Class<T> type, Object id){
em.getTransaction().begin();
T t = em.find(type, id);
em.getTransaction().commit();
return t;
}
...
}
А вот и persistence.xml
<persistence-unit name="CoreInPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.wf.docsys.core.entity.Acknowledgement</class>
<class>com.wf.docsys.core.entity.PackageLog</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/core"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="xxxx"/>
<property name="eclipselink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
Теперь мне нужно добавить веб-модуль поверх этого. Я знаю, что мне нужен JTA
тип транзакции, поэтому я создаю вызов проекта EAR foo
с foo_ejb
и foo_war
. Так что мой EJB выглядит так.
@Stateless
@LocalBean
public class CoreEJB implements EntityDAO{
@PersistenceContext(unitName = "CoreInWeb-ejbPU")
private EntityManager em;
//@Override
public <T> T create(T t) {
em.persist(t);
return t;
}
//@Override
public <T> T find(Class<T> type, Object id) {
return em.find(type, id);
}
...
}
Обратите внимание, что CoreInWeb-ejbPU
- это новое имя модуля persistence.xml с типом транзакции JTA
. Я также добавляю файл jar клиента приложения в пакет foo_ejb
. При развертывании я получил это сообщение Invalid ejb jar [foo-ejb.jar]: it contains zero ejb.
Именно из-за этого @Stateless public class CoreEJB implements EntityDAO
. Если я вытащу implements EntityDAO
, то он будет развернут, но мне нужно, чтобы EJB реализовывал EntityDAO
, чтобы в моем управляемом компоненте я мог сделать это
@ManagedBean
@RequestScoped
public class Bean {
@EJB
private CoreEJB coreEJB;
public Bean() {
}
public void runAppClientMainProcess() {
//The web interface can also kick off the same process as the app client
process(coreEJB);
}
// ...
}
Как я могу сделать это правильно? Пожалуйста, помогите
Я знаю, что, возможно, здесь слишком много просят, но если вы можете опираться на мою структуру выше, покажите мне, как добавить веб-модуль, я был бы очень признателен. Некоторые коды были бы потрясающими. Я все еще учусь, поэтому, если мой дизайн имеет недостатки, не стесняйтесь копировать его, я перепроектирую все, если буду убежден, что есть лучший способ сделать это. Суть в том, что есть набор бизнес-логики, и я хочу получить доступ к ним через application client
и web interface
. Например, у glassfishv3 есть веб-интерфейс и консоль администратора