2015-02-01 4 views
0

Я разрабатываю веб-приложение в Spring Framework в Java. У меня есть проблемы с моей базой данных Postgres. Я пытаюсь добавить запись в таблицу User в db. Данные собираются из полей регистрационной формы. Он хорошо сохраняется, завернутый в объекты User, и все выглядит отлично. За исключением факта, что я не вижу никаких новых строк в моей БД, когда просматриваю его с помощью pgAdmin III. Вот мое добавление логики:Spring - база данных не обновлена ​​

@RequestMapping(value = "/add", method = RequestMethod.POST) 
public String addUser(@ModelAttribute("user") User user, BindingResult result, HttpServletRequest request) { 
    user.setEnabled(true); 
    user.setPosts(0); 
    System.out.println(user.getId()); 

    ArrayList <User> list = (ArrayList<User>) userService.listUser(); 
    System.out.println(list.size()); 

    //if (user.getId()==0) 
    userService.addUser(user); 
//  else 
//   userService.editUser(user); 

    return "redirect:register.html"; 
} 

Я делаю это путем вызова метода, определенного в UserService, который вызывает метод в моем userDAO класса реализации:

public void addUser(User user) { 
    sessionFactory.getCurrentSession().save(user);   
} 

Что любопытно, однако, заключается в том, что, когда Я проверить размер моего списка пользователей, с помощью вызова другой метод userDAO:

public List<User> listUser() { 

    return sessionFactory.getCurrentSession().createQuery("from User order by _id").list(); 
} 

результат не равен нулю, и увеличивается каждый раз, когда я добавить пользователя. Это означает, что данные должны храниться где-то, просто я не знаю, где. Доступ Hibernate определяется в весенне-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" 
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:util="http://www.springframework.org/schema/util" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd 
    http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 


<context:annotation-config /> 
<context:component-scan base-package="dao" /> 
<context:component-scan base-package="service" /> 
<context:component-scan base-package="controllers" /> 

<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <!--Don't add suffix or prefix like you do with .jsp files --> 
    <property name="viewClass" 
     value="org.springframework.web.servlet.view.tiles3.TilesView" /> 
</bean> 

<bean id="tilesConfigurer" 
    class="org.springframework.web.servlet.view.tiles3.TilesConfigurer"> 
    <property name="definitions"> 
     <value>/WEB-INF/tiles.xml</value> 
    </property> 
</bean> 

<bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix"> 
     <value>/WEB-INF/jsp/</value> 
    </property> 
    <property name="suffix"> 
     <value>.jsp</value> 
    </property> 
</bean> 

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
    lazy-init="true"> 
    <property name="driverClassName" value="org.postgresql.Driver" /> 
    <property name="url" 
     value="jdbc:postgresql://localhost:5432/postgres?characterEncoding=utf-8" /> 
    <property name="username" value="postgres" /> 
    <property name="password" value="postgres" /> 
</bean> 

<bean id="hibernateSessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
      <prop key="hibernate.default_schema">spring3</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="hibernate.format_sql">true</prop> 
      <prop key="hibernate.generate_statistics">false</prop> 
     </props> 
    </property> 

    <property name="packagesToScan"> 
     <list> 
      <value>domain</value> 
     </list> 
    </property> 

</bean> 

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

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="hibernateSessionFactory" /> 
</bean> 

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basename" value="classpath:messages" /> 
    <property name="defaultEncoding" value="UTF-8" /> 
</bean> 

<bean id="localeChangeInterceptor" 
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
    <property name="paramName" value="lang" /> 
</bean> 

<bean id="localeResolver" 
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> 
    <property name="defaultLocale" value="en" /> 
</bean> 

<bean id="handlerMapping" 
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <ref bean="localeChangeInterceptor" /> 
    </property> 
</bean> 

Я довольно уверен, тоже, что имя пользователя, пароль и схемы правильны здесь. Также данные отображаются правильно в проводнике источника данных STS. Есть идеи? Я не знаю, где еще искать.

UPDATE: Мой класс, который делает операции имеет соответствующую аннотацию, но она по-прежнему не работает:

Интерфейс:

@Transactional(propagation = Propagation.REQUIRED) 
public interface UserService { 

    public void addUser(User user); 
    public void editUser(User user); 
    public List<User> listUser(); 
    public void removeUser (int id); 
    public User getUser(int id); 

} 

и его реализация:

@Service 
@Transactional 
public class UserServiceImpl implements UserService { 

@Autowired 
UserDAO userDAO; 

@Transactional 
public void addUser(User user) { 
    userDAO.addUser(user); 
} 

@Transactional 
public void editUser(User user) { 
    userDAO.editUser(user); 
} 

@Transactional 
public List<User> listUser() { 

    return userDAO.listUser(); 
} 

@Transactional 
public void removeUser(int id) { 
    userDAO.removeUser(id); 
} 

@Transactional 
public User getUser(int id) { 
    return userDAO.getUser(id); 
} 

} 
+0

Убедитесь, что вы используете правильную базу данных при просмотре записей. Если вы видите их в браузере в STS, записи сохраняются. Поэтому я подозреваю, что вы смотрите в неправильном месте при использовании pgAdmin. –

+0

Попробуйте найти свою базу данных с помощью командной строки, чтобы быть уверенным, что данные не были сохранены, как сказал М. Дейн. Тем не менее я удивлен, что вы не очищаете сеанс или используете нотацию @Transactional на своем контроллере. – EBoulben

+0

Это все еще на ранней стадии, прямо сейчас я просто проверяю, работает ли соединение нормально. – user4359659

ответ

0

Я полагаю, у вас есть проблема, потому что вы не очистили сеанс.

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

Поскольку вы используете Spring, просто добавьте аннотацию @Transactional на свой метод контроллера, должно быть достаточно: оно обрабатывает сеанс, фиксацию и автоматическую очистку.

+0

Да, это звучит логично, но все же мои правки. – user4359659

0

Хорошо, с ваших входов понятно, что вы не настроили транзакцию вручную или автоматически. Вы можете сделать это следующим образом.

Ручные настройки:

В классе DAO, Инициализировать транзакцию и не совершающие вручную.

public void addUser(User user) { 
    try{ 
    Session session = sessionFactory.getCurrentSession(); 
    Transaction trans = session.beginTransaction(); 
    session.save(user); 
    trans.commit(); 
    }catch(Exception e){ 
    trans.rollback(); 
    } 
} 

Autocommit с помощью пружинных @Transactional аннотацию:

Поскольку вы используете Spring вместе с Hibernate, вам не нужно нужно вручную делать все эти фиксации, откатить такие вещи, как я уже упоминал выше (То есть один из способов сделать, но это не очень хорошая практика при использовании вместе с весной). Весна делает это для вас. Вы уже настроили управление транзакциями в своей конфигурации xml Spring. Теперь просто используйте аннотацию @Transactional на вашем контроллере или методы обслуживания, где вы вызываете класс DAO для операций db.

@Transactional 
public xx xx(){ //Your userService method that calls DAO method 
.. 
} 

Примечания: @Transactional аннотаций должны быть Спринг (org.springframework.transaction.annotation.Transactional). Не используйте здесь javax.transaction.

+0

Я добавил эти аннотации. И я уверен, что я использую то же соединение в pgAdmin и DataSourceExplorer из STS, потому что я добавил тестовую таблицу в pgAdmin, и она была обновлена ​​в DataSourceExplorer. Я опубликовал изменения в своем сообщении. Тем не менее, не работает. – user4359659

Смежные вопросы