2014-09-25 3 views
2

см. I m havving user.java для информации о пользователе.Как вставить данные в базу данных с помощью spring + hibernate?

@Entity(name = "user") 
@Table(name = "user") 
public class User { 

    @Id 
    @Column(name = "id") 
    private String id; 
    @Column(name = "password") 
    private String password; 
//getter and setter for this.. 
} 

это мой userdao

public class UserDao { 
    public interface UserDAO { 
     public String insert(User user); 

    } 
} 

и это класс осущ для вставки в базу данных увидеть это был мой code.please проверить его и скажите мне, что я делаю неправильно

@Repository 
@Transactional 
public class UserImpl implements UserDAO { 

    private DataSource dataSource; 

    @Autowired 
    SessionFactory sessionFactory; 
    @Resource(name = "sessionFactory") 
    public void setDataSource(DataSource dataSource) { 
     this.dataSource = dataSource; 
    } 

    @Override 
    public String insert(User use) { 

     Session session = this.sessionFactory.openSession(); 
     try{ 

      Session sess = this.sessionFactory.getCurrentSession();    
      session.save(reg); 


         return (String)user.getUserName(); 
         }catch(Exception e){ 
          System.out.println("in catch"+e.getMessage()); 
          e.printStackTrace(); 

    } 

    } 
} 




} 

и в моем контроллере после успешной регистрации im, вставляя данные в базу данных

userDao.insert(user); 

но я не получаю вывод означает, что никакие данные не вставляются в базу данных.что это ..? это моя конфигурация MVC

<context:component-scan base-package="com.user.xyz" /> 
    <mvc:annotation-driven /> 
    <mvc:resources mapping="/resources/**" location="/resources/images/, /resources/css/" /> 
    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/view/" /> 
     <property name="suffix" value=".jsp" /> 

    </bean> 
+0

Я подозреваю, что вы можете просто нужно добавить '@ Transactional' аннотацию к вашему' insert' метода. Однако у вас есть объект JPA, поэтому есть причина, почему вы не используете диспетчер объектов? Вам не нужно прикасаться к сеансам Hibernate. Также обратите внимание, что если вы добавите Spring Data в свой проект, вы можете удалить свою реализацию и получить полный объем загрузки «бесплатно». :) – Steve

+0

видеть, что это был мой код.пожалуйста, проверьте его и скажите мне, что я делаю неправильно – user3189357

+0

Неправильно как таковое ... просто есть более простые способы (меньше кода). В этом руководстве приведен краткий пример использования Spring Data: http://spring.io/guides/gs/accessing-data-jpa/ ... В основном вы добавляете данные Spring в свои зависимости и изменяете свой интерфейс для расширения CrudRepository или JpaRepository. Тогда вам не нужно писать свою собственную реализацию DAO. – Steve

ответ

0

Помните: У вас нет каких-либо существовать сессии, но вы используете getCurrentSession(). Чтобы использовать этот метод, у вас должен быть сеанс. попробуйте следующее:

Session session = this.sessionFactory.openSession(); 

Теперь у вас была сессия для вашей транзакции.

Вы должны объявить sessionFactory в файле xml (hibernate.xml или spring.xml), а затем использовать @Autowire для его получения и открытия нового сеанса.

+0

... см. Я добавил сессию, но все же я не получаю никаких данных, добавленных в базу данных. Возможно, я проверил свой файл конфигурации mvc. Есть ли необходимость предоставить bean для реализации dao ..? – user3189357

0

У вас есть 2 варианта:

A. сила Hibernate, чтобы смыть любые изменения, сделанные в сессии:

session.save(user); 
session.flush(); 

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

, например:

Transaction tx = null; 

try { 

    session.beginTransaction(); 

    session.save(user); 
    .... 

    tx.commit(); 

} catch (RuntimeException e) { 
    tx.rollback(); 
    throw e; 
} 
0

Если у вас есть несколько вызовов DAO в одном запросе, то session.getCurrentSession() полезна, но я думаю, что это не ваш случай. Если есть только один вызов DAO для запроса, то session.openSession() является правильным способом.

Позаботьтесь о том, чтобы при использовании session.openSession() вы также должны закрыть сеанс.

Лучшее, что нужно сделать, это открыть сеанс для каждого входящего запроса (с помощью фильтра - это самый простой способ сделать это), а затем вызвать sessionFactory.getCurrentSession() во всех ваших DAO, чтобы получить текущий сеанс. Я думаю, ваша проблема в том, что вы не указали фильтр. Таким образом, все ваши DAO будут легко повторно использоваться, и вам не нужно будет закрывать сеанс позже.

Вы можете найти более подробную информацию в документации: Hibernate documentation

0

Я также столкнулся с таким же вопросом, и получил решение.На данный момент проверить ниже процентного пункта

  1. Проверьте соответствующие баночке файлы, которые вы используете
  2. Проверить manifest.mf в папке META-INF для информации приложения.
  3. Проверьте конфигурацию спящего режима в файле конфигурации для конфигурации шаблона спящего режима.
  4. Наконец, если все в порядке, используйте session.flush() перед вставкой.

    Session session = sessionFactory.openSession(); 
    Transaction tx = session.beginTransaction(); 
        { 
         { 
          //... your logic 
          //flush a batch of inserts and release memory: 
          session.flush(); 
          session.clear(); 
         } 
        }

    tx.commit(); session.close()
+0

все есть, но все же я не получаю выход. – user3189357

+1

Нет! Существует определенная проблема с hibernate conf. Можете ли вы поделиться своим сообщением с Plz. Детали? –

+0

может ли сказать мне, есть ли необходимость добавить ref класса jdbcimpl в любой файл конфигурации ..? – user3189357

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