Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Можно ли использовать EntityManager в обычном java-классе? / 14 сообщений из 14, страница 1 из 1
24.04.2012, 09:21:33
    #37767489
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
Вопрос вот в чём:
Создали Некое описание модели в обычном java-классе; описали фабрики, которые работают с объектами и скрывают реализацию...
Хочется сделать что-то типа em.persist();
Вот код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    @PersistenceContext(unitName = "ServerPU")
    private static EntityManager em;
....
....
    public void save(IncidentError incidenterror){
        TempXmlSluchError SluchError2=new TempXmlSluchError(); // Создаётся экземпляр сущности.
        SluchError2.setIdSchet("T"); // Просто какие-то значения.
        SluchError2.setIdSluch("T");
        SluchError2.setImPol("R");
        em.persist(SluchError2); // Хотим записать данные в БД.
    }


Вот на строчке em.persist(SluchError2); возникает исключение.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.glassfish.appclient.client.acc.AppClientContainer.launch(AppClientContainer.java:438)
	at org.glassfish.appclient.client.AppClientFacade.launch(AppClientFacade.java:182)
	at org.glassfish.appclient.client.AppClientGroupFacade.main(AppClientGroupFacade.java:65)
Caused by: javax.ejb.EJBException
	at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5193)
	at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5091)
	at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4879)
	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2039)
	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1990)
	at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:213)
	at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:79)
	at $Proxy279.testHello(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:144)
	at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:174)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990)
	at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324)
	at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
	at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
Caused by: java.lang.NullPointerException
	at com.imc.medfin.server.dao.factory.OracleFactory.OracleIncidentErrorFactory.save(OracleIncidentErrorFactory.java:42)
	at Test_ejb_SessionBeans.Test_ejb_SessionBeanMy.testHello(Test_ejb_SessionBeanMy.java:19)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
	at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
	at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5366)
	at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
	at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
	at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)
	at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5338)
	at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5326)
	at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:206)
	... 19 more


Если этот код перенести в EJB-модуль, то там всё прекрасненько работает.
Вот Persistence.xml:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="ServerPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>EntityPack.TempXmlDs</class>
....
....
    <class>EntityPack.TempXmlSluchError</class>
....
....
    <class>EntityPack.TempXmlZglv</class>
    <shared-cache-mode>NONE</shared-cache-mode>
    <validation-mode>NONE</validation-mode>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
      <property name="javax.persistence.jdbc.password" value="medfin"/>
      <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
      <property name="javax.persistence.jdbc.user" value="medfin"/>
    </properties>
  </persistence-unit>
</persistence>


transaction-type="JTA" выставил так, потому что с transaction-type="RESOURCE_LOCAL" не deploy'елось.

Смысл:
Подключаю обычный java класс, в котором описаны фабрики, к EJB-модулю, как библиотеку, и из EJB-модуля хочу вызвать метод из этой библиотеки, а в результате хочу получить запись в БД, посредством вызова em.persist(), но вылазиет вышеописанное исключение.
...
Рейтинг: 0 / 0
24.04.2012, 12:05:42
    #37767862
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
Niky4000Можно ли использовать EntityManager в обычном java-классе?можно
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
java.util.Properties p = new java.util.Properties();
p.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
p.put("hibernate.connection.url", "jdbc:postgresql://127.0.0.0:5432/db");
p.put("hibernate.connection.driver_class", "org.postgresql.Driver");
p.put("hibernate.connection.username", "postgres");
p.put("hibernate.connection.password", "postgres");

org.hibernate.ejb.Ejb3Configuration c = new org.hibernate.ejb.Ejb3Configuration();
c.addProperties(p);

c.addAnnotatedClass(SomeEntity1.class);
c.addAnnotatedClass(SomeEntity2.class);

javax.persistence.EntityManager e = c.buildEntityManagerFactory().createEntityManager();

Long id = 1L;
SomeEntity1 se1 = e.find(SomeEntity1.class, id);
...
Рейтинг: 0 / 0
24.04.2012, 13:41:37
    #37768135
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
grasoff.net
Спасибо, но по-моему это что-то из серии "как вызвать метод session bean'а из обычного java-класса".
Наверное, более правильно засунуть все вызовы em.persist() и всё что с ними связано в EJB-модуль.
...
Рейтинг: 0 / 0
24.04.2012, 15:45:24
    #37768460
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
херасе
...
Рейтинг: 0 / 0
24.04.2012, 15:49:09
    #37768473
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
// ejb
@Stateless
class MyEjb {
  @PersistenceContext(unitName = "ServerPU")
  private static EntityManager em; // зачем статик? м?

  public void someMethod() {
    UsualClass o = new UsualClass(em);
    o.save(...);
  }
}

// UsualClass
class UsualClass {
  EntityManager em;
  UsualClass(EntityManager em) {
    this.em = em;
  }

  void save(IncidentError incidenterror){
    TempXmlSluchError SluchError2=new TempXmlSluchError(); // Создаётся экземпляр сущности.
    SluchError2.setIdSchet("T"); // Просто какие-то значения.
    SluchError2.setIdSluch("T");
    SluchError2.setImPol("R");
    em.persist(SluchError2); // Хотим записать данные в БД.
  }
}
...
Рейтинг: 0 / 0
24.04.2012, 16:37:44
    #37768685
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
В EJB всё работает.
Наверное, и не стоит заморачиваться - просто делать работу с em в StatelessBean и всё.
А static или нет - какая разница?
...
Рейтинг: 0 / 0
24.04.2012, 16:42:04
    #37768705
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
Niky4000Наверное, и не стоит заморачиваться - просто делать работу с em в StatelessBean и всё.
Stateless/Statefull bean самое правильное, иначе тебе придется еще управлять транзакциями в ручную.
Niky4000А static или нет - какая разница?EntityManager потоко-небезопастный объект и если все будут использовать один и тот же экземпляр, то возможны проблемы.
...
Рейтинг: 0 / 0
26.04.2012, 15:38:00
    #37772579
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
авторEntityManager потоко-небезопастный объект и если все будут использовать один и тот же экземпляр, то возможны проблемы.
То есть EntityManager обязан быть не static, чтобы проблем с транзакциями в СУБД не было?
...
Рейтинг: 0 / 0
26.04.2012, 15:42:01
    #37772587
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
Niky4000То есть EntityManager обязан быть не static, чтобы проблем с транзакциями в СУБД не было?
То что он будет не static ещё не гарантирует что несколько потоков к нему не смогут обратиться. В stateless session bean, например, параллельным потокам выдаются разные инстансы. Экземпляр EntityManager, обычно, связан с транзакцией. В JEE этим контейнер занимается. Вне JEE это уже ваша личная ответственность, как создавать, когда закрывать. Хоть ThreadLocal, хоть явно. Мы же не знаем что у вас за клиентская часть.
...
Рейтинг: 0 / 0
26.04.2012, 19:03:33
    #37772965
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
Niky4000,

EntityManager можно использовать в разных средах. Для container-managed em многое делается контейнером: потокобезопасность, управление транзакциями. В application-managed em многое приходится делать самому. Последовательность будет примерно такая:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   EntityManagerFactory emf = Persistence.createEntityManagerFactory("<name>");
   EntityManager em = emf.createEntityManager();
   EntityTransaction trans = em.getTransaction();
   try {
        trans.begin();
        em.persist(); // и т.п.
        trans.commit();
   } catch (Exception e) { trans.rollback(); }
   em.close();
   emf.close();
...
Рейтинг: 0 / 0
27.04.2012, 11:12:52
    #37773656
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
Клиентская часть у меня GUI клиент, типа Enterprise Application. Он пакуется вместе с EJB-модулем в EAR и разворачивается на GlassFish.
А я не совсем понял в каком случае EntityManager у меня управляется клиентом, а в каком контейнером? Как узнать это? Кем управляется EntityManager?
А если, допустим, у меня container-managed EntityManager, то примерно так:
Код: sql
1.
2.
3.
SomeEntity.setSomeField1(...);
SomeEntity.setSomeField2(...);
em.persist(SomeEntity.class);


Можно ли в случае container-managed EntityManager вообще без транзакций обойтись - типа и так всё commit'тится?
...
Рейтинг: 0 / 0
27.04.2012, 11:17:28
    #37773673
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
Niky4000Можно ли в случае container-managed EntityManager вообще без транзакций обойтись - типа и так всё commit'тится?да
...
Рейтинг: 0 / 0
27.04.2012, 11:40:03
    #37773754
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
А как узнать кем управляется EntityManager: контейнером или приложением?
Мне кажется, что если я разворачиваю EAR на сервере приложений, то EntityManager должен управляться контейнером.
Тогда я не могу представить ситуацию когда бы он управлялся приложением. В каком случае это может быть?
...
Рейтинг: 0 / 0
27.04.2012, 16:52:49
    #37774743
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли использовать EntityManager в обычном java-классе?
Niky4000А как узнать кем управляется EntityManager: контейнером или приложением?
Мне кажется, что если я разворачиваю EAR на сервере приложений, то EntityManager должен управляться контейнером.
Тогда я не могу представить ситуацию когда бы он управлялся приложением. В каком случае это может быть? Если ты получаешь ссылку на EntityManager в Stataless\Statefull бине с помошью dependency injection то это container-managed. Получение EntityManager с помощью EntityManagerFactory это application-managed.

Как обстоят дела с английским? А вообще как бы дела не обстояли, самый легкий способ во всем разобраться это прочитать спецификацию. У JPA 1.0 спецификация небольшая всего-то 250 страниц. Если же с английским большие проблемы, то тем более нужно начитать.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Можно ли использовать EntityManager в обычном java-классе? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]