powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Можно ли использовать EntityManager в обычном java-классе?
14 сообщений из 14, страница 1 из 1
Можно ли использовать EntityManager в обычном java-классе?
    #37767489
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос вот в чём:
Создали Некое описание модели в обычном 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
Можно ли использовать EntityManager в обычном java-классе?
    #37767862
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Можно ли использовать EntityManager в обычном java-классе?
    #37768135
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grasoff.net
Спасибо, но по-моему это что-то из серии "как вызвать метод session bean'а из обычного java-класса".
Наверное, более правильно засунуть все вызовы em.persist() и всё что с ними связано в EJB-модуль.
...
Рейтинг: 0 / 0
Можно ли использовать EntityManager в обычном java-классе?
    #37768460
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
херасе
...
Рейтинг: 0 / 0
Можно ли использовать EntityManager в обычном java-классе?
    #37768473
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Можно ли использовать EntityManager в обычном java-классе?
    #37768685
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В EJB всё работает.
Наверное, и не стоит заморачиваться - просто делать работу с em в StatelessBean и всё.
А static или нет - какая разница?
...
Рейтинг: 0 / 0
Можно ли использовать EntityManager в обычном java-классе?
    #37768705
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Niky4000Наверное, и не стоит заморачиваться - просто делать работу с em в StatelessBean и всё.
Stateless/Statefull bean самое правильное, иначе тебе придется еще управлять транзакциями в ручную.
Niky4000А static или нет - какая разница?EntityManager потоко-небезопастный объект и если все будут использовать один и тот же экземпляр, то возможны проблемы.
...
Рейтинг: 0 / 0
Можно ли использовать EntityManager в обычном java-классе?
    #37772579
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторEntityManager потоко-небезопастный объект и если все будут использовать один и тот же экземпляр, то возможны проблемы.
То есть EntityManager обязан быть не static, чтобы проблем с транзакциями в СУБД не было?
...
Рейтинг: 0 / 0
Можно ли использовать EntityManager в обычном java-классе?
    #37772587
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Niky4000То есть EntityManager обязан быть не static, чтобы проблем с транзакциями в СУБД не было?
То что он будет не static ещё не гарантирует что несколько потоков к нему не смогут обратиться. В stateless session bean, например, параллельным потокам выдаются разные инстансы. Экземпляр EntityManager, обычно, связан с транзакцией. В JEE этим контейнер занимается. Вне JEE это уже ваша личная ответственность, как создавать, когда закрывать. Хоть ThreadLocal, хоть явно. Мы же не знаем что у вас за клиентская часть.
...
Рейтинг: 0 / 0
Можно ли использовать EntityManager в обычном java-классе?
    #37772965
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Можно ли использовать EntityManager в обычном java-классе?
    #37773656
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Клиентская часть у меня 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
Можно ли использовать EntityManager в обычном java-классе?
    #37773673
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Niky4000Можно ли в случае container-managed EntityManager вообще без транзакций обойтись - типа и так всё commit'тится?да
...
Рейтинг: 0 / 0
Можно ли использовать EntityManager в обычном java-классе?
    #37773754
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как узнать кем управляется EntityManager: контейнером или приложением?
Мне кажется, что если я разворачиваю EAR на сервере приложений, то EntityManager должен управляться контейнером.
Тогда я не могу представить ситуацию когда бы он управлялся приложением. В каком случае это может быть?
...
Рейтинг: 0 / 0
Можно ли использовать EntityManager в обычном java-классе?
    #37774743
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Niky4000А как узнать кем управляется EntityManager: контейнером или приложением?
Мне кажется, что если я разворачиваю EAR на сервере приложений, то EntityManager должен управляться контейнером.
Тогда я не могу представить ситуацию когда бы он управлялся приложением. В каком случае это может быть? Если ты получаешь ссылку на EntityManager в Stataless\Statefull бине с помошью dependency injection то это container-managed. Получение EntityManager с помощью EntityManagerFactory это application-managed.

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


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