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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> настройка Spring JPATransactionManager, данные не сохраняются 
V
    Опции темы
Andy_L20066
Дата 19.3.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Привет, вообщем использую Spring 3.0.0 Release, Derby - как базу данных ну и JPA + Hibernate.... вообщето хочу подключить использование JOTM для транзакций, но решил что пока обойдусь JpaTransactionManager... проблема в том что данные просто не попадают в базу и никаких иксепшинов на консоле нету.

мой persistence.xml
Код

<persistence 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_1_0.xsd"
             version="1.0">

    <persistence-unit name="persistence-derby" transaction-type="RESOURCE_LOCAL">
        <!--provider>org.hibernate.ejb.HibernatePersistence</provider -->
        <class>model.User</class>
    <!-- Apache Derby (JavaDB) -->
    <properties>
            <property name="hibernate.archive.autodetection" value="class" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
            <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver"/>
            <property name="hibernate.connection.url" value="jdbc:derby:/database/jpa-test-database;create=true"/>  
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
    
    </persistence-unit>
</persistence>


Код

@Entity
@Table(name = "Users")
@SequenceGenerator(name = "SEQ_USER", sequenceName = "USER_ID_SEQUENCE")
public class User implements Serializable{

    private Long id;
    private String username;
    private String password;
    private Enum role;

    @Id
    @GeneratedValue(generator = "SEQ_USER")
    @Column(name = "id")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "username")
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username=username;
    }

    @Column(name = "password")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Enumerated(EnumType.STRING)
    @Column(name = "role")
    public Enum getRole() {
        return role;
    }

    public void setRole(Enum role) {
        this.role = role;
    }
   
}


клас UserDAO
Код

public class UserDAO extends AbstarctUserDAO {
   
    public void insertUser(User user) {
        getEntityManager().persist(user);

    }

    public User getUser(String name) {
        Query query = getEntityManager().createQuery("FROM User user WHERE user.username = :username");
        query.setParameter("username", name);
        return (User) query.getSingleResult();
    }

    public boolean removeUser(User user) {
        User userx = getEntityManager().find(User.class, user.getId());
        getEntityManager().remove(userx);
        return true;
    }

}


код AbstractUserDAO
Код

public abstract class AbstractUserDAO implements IGenericDAO{

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

    protected EntityManager getEntityManager() {
        if (entityManager == null)
            throw new IllegalStateException(
                    "EntityManager has not been set on DAO before usage");
        return entityManager;
    }
  
}



конфигурация спринг.xml: 
Код

 <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="persistence-derby"/>
        <!--property name="persistenceXmlLocation"
                  value="classpath:/META-INF/persistence.xml"/>
        <property name="persistenceProvider">
            <bean class="org.hibernate.ejb.HibernatePersistence"/>
        </property -->
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                        <property name="database" value="DERBY" />
                        <property name="databasePlatform" value="org.hibernate.dialect.DerbyDialect"/>
                        <property name="showSql" value="true"/>
                <property name="generateDdl" value="false"/>
                </bean>
        </property>

    </bean>
       
    <bean id="userDAO" class="dao.UserDAO"/>
    <bean id="userService" class="service.UserService">
        <property name="userDAO" ref="userDAO"/>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
           destroy-method="close" scope="singleton">
           <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
            <property name="url" value="jdbc:derby:/database/jpa-test-database"/>
            <property name="username" value=""/>
            <property name="password" value=""/>
    </bean>

    <bean id="jpaTransactionManager"
          class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
       <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:annotation-driven transaction-manager="jpaTransactionManager"/>

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />


ну и сам сервис собственно (тут у меня закоменчен предыдущий подход не через txadvice): 
Код

public class UserService extends AbstractService{

      IGenericDAO userDAO;

    
    public IGenericDAO getUserDAO() {
        return userDAO;
    }

    public void setUserDAO(IGenericDAO userDAO) {
        this.userDAO = userDAO;
    }

   @Transactional
    public void insertUser(User user){
        // TransactionStatus transactionStatus = startTransaction();
        userDAO.insertUser(user);
        //commitTransaction(transactionStatus);
               
    }
    @Transactional
    public User getUser(String name){
        //TransactionStatus transactionStatus = startTransaction();
        User user = getUserDAO().getUser(name);
        //commitTransaction(transactionStatus);
        return user;
    }

    @Transactional
    public boolean removeUser(User user){
        //TransactionStatus transactionStatus = startTransaction();
        boolean result = getUserDAO().removeUser(user);
        //commitTransaction(transactionStatus);
        return result;
    }
}


Запускается это дело следующим образом (имеется тест), который не выдает никакого иксепшина, но видно что данные не записываются в таблицу, поскольку тест возвращает иксепшин javax.persistence.NoResultException: No entity found for query:
Код

 protected String[] getConfigLocations() {
        return new String[] { "applicationContext-business.xml"};
                
}
  public void testFindUserById() {

     User user = new User();
             user.setUsername("hello885");
            user.setPassword("12345");
            user.setRole(Role.USER);
         getUserService().getUserDAO().insertUser(user);
            User createdUser = getUserService().getUserDAO().getUser("hello885");
            assertNotNull(createdUser);
    }



Главное что данные вроде выбирает с таблицы нормально, тоесть код 
Код

 User createdUser = getUserService().getUserDAO().getUser("hello885");


работает, если руками там чего то добавить в базу, он юзера возвращает... 

ну вот почему данные в таблицу не попадают - не могу знать... точно где-то что-то нехорошо из конфигурацией JpaTransactionManager, но вот не знаю что... может кто сталкивался с такой проблемой...


Заранее спасибо!!!

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


Бывалый
*


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

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



а если попробовать заменить
Код

getUserService().getUserDAO().insertUser(user);

на 
Код

getUserService().insertUser(user);


???
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
Andy_L20066
Дата 21.3.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



cпасибо, уже увидел это...  помогло...

но вот есть еще одна проблема (может кто знает), интегрируюсь из Spring Security, добавил руками юзера в базу данных, юзер существует... но когда запускаю апликацию из Томката и пробую логинится, так мне выдает сервер что юзера такого нету: 
Код

javax.persistence.NoResultException: No entity found for query
    org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:83)
    se.wip.dao.UserDAO.getUser(UserDAO.java:28)
    se.wip.service.UserService.getUser(UserService.java:44)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    $Proxy20.getUser(Unknown Source)
    se.wip.service.UserServiceImpl.loadUserByUsername(UserServiceImpl.java:39)
    org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:83)



мой сервис 
Код

public class UserServiceImpl implements UserDetailsService {
    IUserService userService;

    public IUserService getUserService() {
        return userService;
    } 

    public void setUserService(IUserService userService) {
        this.userService = userService;
    }

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
        User userRetreived;
        try {
             userRetreived = getUserService().getUser(username);
        } catch (EmptyResultDataAccessException e) {
            throw new UsernameNotFoundException(
                    "org.test.spring.UsernameNotFound");
        }

        String role = userRetreived.getRole().name();
        return new org.springframework.security.core.userdetails.User(userRetreived.getUsername(), userRetreived.getPassword(), true, true, true, true, getAuthorities(userRetreived));
    }

    private Collection<GrantedAuthority> getAuthorities(User user) {
        Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        authorities.add(new GrantedAuthorityImpl("ROLE_USER"));
        return authorities;
    }

}
    



может что не так с конфигурацией загрузки данных из базы?

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.3914 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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