Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Не сохраняется сущность в базе / 7 сообщений из 7, страница 1 из 1
05.05.2012, 15:23:47
    #37783761
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не сохраняется сущность в базе
Подскажите пожалуйста.
Приложение использует Spring webflow + JPA на базе Hibernate.
Есть такая сущность

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Entity
@Table(name = "SUPER_ADMINS")
public class SuperAdmin implements Serializable
{
    private static final long serialVersionUID =1212121232423453452L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String login;
    private String password;
    private String name;



Есть сервис который его сохраняет в базу

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
@Service("superAdminService")
@Repository
public class JPASuperAdminService implements SuperAdminService, Serializable
{
    private static final long serialVersionUID = 1L;
    private final static Logger logger = LoggerFactory.getLogger(JPASuperAdminService.class);

    private EntityManager em;

    @PersistenceContext
    public void setEntityManager(EntityManager em)
    {
        this.em = em;
    }

    public void createFlows()
    {
        try
        {
            Query query = em.createQuery("select  sa from SuperAdmin sa where sa.login = :login");
            query.setParameter("login","GOLD");
            List<SuperAdmin> superAdmins = query.getResultList();
            for(SuperAdmin  superAdmin : superAdmins)
            {
                System.out.println(superAdmin.getLogin());
            }

            EnterpriseFlow enterpriseFlow = new EnterpriseFlow("Registration-customer-flow");
            em.persist(enterpriseFlow);

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

    }
}



Первую часть специально сделал, чтобы увидеть, есть ли select из базы
В консоли Томката select выводится.

Код: java
1.
Hibernate: select superadmin0_.id as id3_, superadmin0_.login as login3_, superadmin0_.name as name3_, superadmin0_.password as password3_ from SUPER_ADMINS superadmin0_ where superadmin0_.login=?



То есть доступ к базе есть и select выполняется.

А на момент, когда должен отработать em.persist(enterpriseFlow), выводится только вот это

Код: java
1.
Hibernate: select nextval ('hibernate_sequence')



и никаких insert.

Вроде бы достаточно достаточно em.persist(entity) ? Или чего то не хватает, чтобы сохранить сущность в базе?
...
Рейтинг: 0 / 0
05.05.2012, 15:31:06
    #37783777
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не сохраняется сущность в базе
Транзакцию надо добавить, примерно так
Код: java
1.
2.
3.
4.
5.
6.
7.
try {
            em.getTransaction().begin();
            em.persist(entity);
            em.getTransaction().commit();
        } finally {
            em.close();
        }
...
Рейтинг: 0 / 0
05.05.2012, 16:50:52
    #37783952
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не сохраняется сущность в базе
osonЕсть сервис который его сохраняет в базу

как бы ты сохраняешь EnterpriseFlow, а в базе ждёшь чего-то волшебного в таблице SUPER_ADMINS
базы они ведь глуповаты
тебе надо подсказать ей кое-что*

* - пусть это будет домашним заданием

про транзакции уже сказали
я ещё добавлю, что если у тебя есть
Код: java
1.
private final static Logger logger = LoggerFactory.getLogger(JPASuperAdminService.class);

, то почему бы не воспользоваться
Код: java
1.
logger.trace(superAdmin.getLogin())

вместо
Код: java
1.
System.out.println(superAdmin.getLogin());
...
Рейтинг: 0 / 0
05.05.2012, 16:51:48
    #37783954
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не сохраняется сущность в базе
NixicТранзакцию надо добавить, примерно так
Код: java
1.
2.
3.
4.
5.
6.
7.
try {
            em.getTransaction().begin();
            em.persist(entity);
            em.getTransaction().commit();
        } finally {
            em.close();
        }

em.close() лишнее в контексте данного топика
...
Рейтинг: 0 / 0
05.05.2012, 18:11:25
    #37784094
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не сохраняется сущность в базе
grasoff.netem.close() лишнее в контексте данного топика
копипаст :)
...
Рейтинг: 0 / 0
05.05.2012, 18:13:35
    #37784097
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не сохраняется сущность в базе
Nixicкопипастчото в пермь захотелось, на родину почти что..
...
Рейтинг: 0 / 0
05.05.2012, 21:37:40
    #37784269
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не сохраняется сущность в базе
Да, с транзакцией я чтото протупил.
Думал Spring webflow сам ее цепляет к каждому методу.

Код: java
1.
2.
3.
 em.getTransaction().begin();
            em.persist(entity);
            em.getTransaction().commit();


то выскакивает эксепшин

Код: java
1.
java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead



Посмотрел как настроить транзакцию для flow.
Добавляю в файл my-flow.xml

Код: java
1.
<persistence-context/>



Далее в один из файлов конфигурации webflow-config.xml указываю

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<webflow:flow-executor id="flowExecutor"  flow-registry="flowRegistry">
    <webflow:flow-execution-listeners>
        <webflow:listener ref="jpaFlowExecutionListener" />
       .....
         </webflow:flow-execution-listeners>
/webflow:flow-executor>

 <bean id="jpaFlowExecutionListener"
          class="org.springframework.webflow.persistence.JpaFlowExecutionListener">
        <constructor-arg ref="entityManagerFactory" />
        <constructor-arg ref="transactionManager" />
 </bean>



entityManagerFactory и transactionManager указывают уже на соответствующие бины.

(для удобства конфигурационных файлов несколько и все их названия перечислены в файле web-application-config.xml, который упомянут уже в самом web.xml в качестве <param-name>contextConfigLocation).

И еще в файле my-flow.xml добавил

Код: xml
1.
<end-state id="complete"  commit="true"/>



Теперь у меня например в AdminService есть несколько методов, которые сохраняют такие сущности как EnterpriseFlow и связанные с ним Role.
Сделал все их полями класса и вызываю сохранение из двух разных методов (срабатывающих от двух разных кнопок и соотв два разных requesta на сервер).

Код: 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.
public class JPASuperAdminService
{
    private Role customerRegistratorRole;
    private Role ordersHandlerRole;
    public void createRoles()
    {
            customerRegistratorRole = new Role(RoleName.CUSTOMER_REGISTRATOR);
            ordersHandlerRole = new Role(RoleName.ORDERS_HANDLER);
     }
    
     public void createFlows()
     {
           registrationFlow = new EnterpriseFlow(EnterpriseFlowName.REGISTRATION_FLOW);
           orderHandlingFlow = new EnterpriseFlow(EnterpriseFlowName.ORDER_HANDLING_FLOW);
           purchasePreparingFlow = new EnterpriseFlow(EnterpriseFlowName.PURCHASE_PREPARING_FLOW);

           customerRegistratorRole.addFlow(registrationFlow);
           ordersHandlerRole.addFlow(orderHandlingFlow);
            ordersHandlerRole.addFlow(purchasePreparingFlow);

            em.persist(customerRegistratorRole);
            em.persist(ordersHandlerRole);
     }
}



Так как в классе Role указано

Код: java
1.
2.
@OneToMany(mappedBy = "role", cascade = CascadeType.PERSIST)
    private Set<EnterpriseFlow> flows = new HashSet<EnterpriseFlow>();



то сохраняю только Role

Все сохраняется только на момент перехода на end-state.
То есть пока flow не пройдет, коммита нет.

Но ведь flow не обязательно по логике соответствует транзакции. Как то неудобно их привязывать. Может быть надо по ходу потока что-то сохранить, потом что-то проверить, что-то удалить и тд.
Как тут поступать? Как привязать транзакцию к реквесту на сервер (классический вариант) ?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Не сохраняется сущность в базе / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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