Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка Cannot persist detached object 
V
    Опции темы
aol
Дата 25.10.2008, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



под утро уже не вижу что сервак хочет )
фсе деплоиться хорошо, но вот при доступе к базе, теперь фсегда ошибка java.lang.IllegalStateException

да, и то есть теперь необходимости нет в постоянно
      em.getTransaction().begin();
      em.persist(user);
      em.getTransaction().commit();

нужно сразу 
      em.persist(user);
или
      em.refresh(user);
или тд..


PM MAIL   Вверх
powerOn
Дата 25.10.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



Цитата(aol @  25.10.2008,  03:47 Найти цитируемый пост)
при попытке деплоя ear такая вот ошибка

Deploying application in domain failed; The persistence-context-ref-name [portal.db.ContractManager/em] in module [] resolves to a persistence unit called [portalJPA] which is of type RESOURCE_LOCAL. Only persistence units with transaction type JTA can be used as a container managed entity manager. Please verify your application.


поменяйте в persistance.xml:
Код

<persistence-unit name="portalJPA" transaction-type="RESOURCE_LOCAL">


на
Код

<persistence-unit name="portalJPA" transaction-type="JTA">



Цитата(aol @  25.10.2008,  04:44 Найти цитируемый пост)
да, и то есть теперь необходимости нет в постоянно
      em.getTransaction().begin();
      em.persist(user);
      em.getTransaction().commit();

нужно сразу 
      em.persist(user);
или
      em.refresh(user);
или тд..


Да, теперь не нужно вызывать  em.getTransaction().begin(); или em.getTransaction().commit();. Commit произойдет автоматически. А что бы откатит транзакцию, придется получить ссылку на SessionContext через инъекцию:
Код

@Resource
private SessionContext sessionContext;

и вызывать
Код

sessionContext.setRollbackOnly();


И еще, не забудьте использовать аннотации @TransactionAttribute на методах EJB, что бы отметить необходимую логику транзакции.





--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
aol
Дата 25.10.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



на JTA уже поменял

как понимаю sessionContext.setRollbackOnly();
должно быть в блоке catch/finally метода где persist.()
@TransactionAttribute тоже на методах где просходит persist.().. ?

PM MAIL   Вверх
powerOn
Дата 25.10.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



Цитата(aol @  25.10.2008,  14:04 Найти цитируемый пост)
как понимаю sessionContext.setRollbackOnly();
должно быть в блоке catch/finally метода где persist.()


Зависит от логики работы программы. Если при таких условиях нужно откатывать транзакцию, то да.

Цитата(aol @  25.10.2008,  14:04 Найти цитируемый пост)
@TransactionAttribute тоже на методах где просходит persist.().. ?


Почитайте в документации об аннотации @TransactionAttribute и её параметрах. Так же проанализируйте логику вашей программы, где и как должны работать транзакции.  Уже в зависимости от этого, расставляйте аннотации. В частности, для persists() транзакция вам точно потребуется.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
aol
Дата 25.10.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



методы проаннотировал как @TransactionAttribute(value = REQUIRES_NEW)
получаю ошибку javax.persistence.TransactionRequiredException

заметил что ошибка возникает на persis, find, тд..
на запросах типа  Query query = em.createNamedQuery("findUserByEmail"); все нормально

    






PM MAIL   Вверх
powerOn
Дата 25.10.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



а если REQUIRED попробовать? (ну или @TransactionAttribute без параметров указать, тогда будет выставлен тип REQUIRED по умолчанию).


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
aol
Дата 25.10.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



делал по разному, и REQUIRED  и без параметров тоже

PM MAIL   Вверх
powerOn
Дата 25.10.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



у меня такой код отработал без ошибок:

Код

@Stateless(name = "NewSessionBean")
public class NewSessionBean implements NewSessionLocal
{
    @PersistenceContext(unitName = "EnterpriseApplication1-ejbPU")
    private EntityManager em;

    @TransactionAttribute
    public String getMessage()
    {
        Query query = em.createNamedQuery("getSimpleEntities"); // @NamedQuery(name="getSimpleEntities", query="select s from SimpleEntity s") 
        SimpleEntity entity = new SimpleEntity("This is just a simple message!");
        em.persist(entity);
        List<SimpleEntity> resultList = (List<SimpleEntity>) query.getResultList();
        return resultList.get(0).getMessage();
    }
}


Добавлено через 4 минуты и 20 секунд
Кстати, смотрел непосредственно в БД, новая запись там появляется. Т.е. persist и commit отрабатывают.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
aol
Дата 25.10.2008, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



да, тоже самое, только без implements Local
быть может что то не инджектиться, но что и когда не знаю

PM MAIL   Вверх
powerOn
Дата 25.10.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



Ваш EJB компонент должен имплементировать локальный интерфейс. У меня было сделано так:
Код

import javax.ejb.Local;

@Local
public interface NewSessionLocal {
    public String getMessage();
}


метод getMessage объявлен в локальном интерфейсе и будет управляться контейнером, т.е. будет выполнятся с учетом транзакций и секьюрити. 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
aol
Дата 26.10.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



добавил
Код

@Local
public interface UserManagerLocal {
  public boolean findUserByEmail(String email);
  public boolean addUser(User user);
  public User findUser(String email, String password);
}


Код

@Stateless(name = "UserManager")
public class UserManager implements UserManagerLocal{
  
  @PersistenceContext(unitName = "portalJPA")
  private EntityManager em;

  @TransactionAttribute
  public User findUser(String email, String password){
    User user = null;
    try{
      Query query = em.createNamedQuery("checkUser");
      query.setParameter("email", email);
      query.setParameter("password", password);
      user = (User)query.getSingleResult();
    }catch (NoResultException ex){
    }
    return user;
  }

  @TransactionAttribute
  public boolean findUserByEmail(String email){
    boolean ret = false;
    try{
      Query query = em.createNamedQuery("findUserByEmail");
      query.setParameter("email", email);
      if(query.getResultList().size() > 0) ret = true;
    }finally {
    }
    return ret;
  }

 @TransactionAttribute
  public boolean addUser(User user){
    boolean ret = false;
    try{
      user.setSince(new Date());
      em.persist(user);
      ret = true;
    }finally {
    }
    return ret;
  }


в классе
public class UserAuthBean {
,методы которого вызываются с jsf
пробовал описать

private UserManager userManager;
if(userManager.addUser(user)) {...

так и 

private UserManagerLocal userManager;
if(userManager.addUser(user)) {...

получаю javax.persistence.TransactionRequiredException

возможно нужно что то еще проаннотировать.

нужно ли аннотировать

public class UserAuthBean {
@EJB
private UserManager userManager; ?





Это сообщение отредактировал(а) aol - 26.10.2008, 14:40
PM MAIL   Вверх
powerOn
Дата 26.10.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



Если EJB создан как:

Код

@Stateless(name = "NewSessionBean")
public class NewSessionBean implements NewSessionLocal
{
...
}


в бине JSF пишется инъекция таким образом:

Код

    @EJB(beanName = "NewSessionBean")
    private NewSessionLocal newSessionLocal;



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
aol
Дата 26.10.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



получаю вот что теперь 
com.sun.enterprise.deployment.backend.IASDeploymentException: Error loading deployment descriptors for module [Web] -- Error: Unresolved <ejb-link>: UserManager
или теперь нужно фсе entity описать в ejb-jar.xml ?
немного не понимаю что происходит
PM MAIL   Вверх
powerOn
Дата 26.10.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



А что Вы кстати деплоите? И на какой сервер.
У меня ear архив, который содержит jar с EJB компонентами и war с web-приложением.
Прикрепил свой проект (для NetBeans IDE).






Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  EnterpriseApplication1.zip 45,21 Kb


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
aol
Дата 26.10.2008, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



сервер sun app server, деплою из идеи, ear, идея помещает файл ear в каталог сервера autodeploy.
по смыслу вроде тоже самое что и у вас. 
разницу увидел в том, что у меня jsf страница вызывает методы у своего бина, который в свою очередь вызывает промежуточный бин у которого есть @EJB(beanName = "UserManager") а уже он обращается к UserManager

пробовал деплоить вручную из вебконсоли, ошибка при деплое war 
Deploying application in domain failed; Error loading deployment descriptors for module [Web] -- Error: Unresolved : UserManager Error loading deployment descriptors for module [Web] -- Error: Unresolved : UserManager 

выслал вам на email, может там виднее )
сюда не помещается

Это сообщение отредактировал(а) aol - 26.10.2008, 19:51
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0702 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.