powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Не сохраняется сущность в базе
7 сообщений из 7, страница 1 из 1
Не сохраняется сущность в базе
    #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
Не сохраняется сущность в базе
    #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
Не сохраняется сущность в базе
    #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
Не сохраняется сущность в базе
    #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
Не сохраняется сущность в базе
    #37784094
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasoff.netem.close() лишнее в контексте данного топика
копипаст :)
...
Рейтинг: 0 / 0
Не сохраняется сущность в базе
    #37784097
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixicкопипастчото в пермь захотелось, на родину почти что..
...
Рейтинг: 0 / 0
Не сохраняется сущность в базе
    #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
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Не сохраняется сущность в базе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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