2013-12-26 3 views
0

У меня есть проблема с сохранением моего лица, я использую spring 4 и hibernate 4.Проблема с сохранением моих объектов

@Repository 
    public class AuthDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Transactional 
    public void enregistrer(Auth auth) { 
    Session session = sessionFactory.openSession(); 
    session.saveOrUpdate(auth); 
    } 

не добавляли записи в моей базе данных. Но если я хочу просто читать, то это ок.

session.get(Auth.class, 2) 

моя вторая проблема в том, что я хочу понять, почему, когда я поставил:

Session session = sessionFactory.getCurrentSession(); 

это не работает, и я получил:

No Session found for current thread 

мои другие файлы:

@Controller 
public class testController { 


@Autowired 
private AuthDao authDao; 

@RequestMapping(value = "/cc") 
public String printWelcome() { 

    authDao.enregistrer(new Auth(7, "test", "test")); 
    return "hello"; 

} 

}

<context:component-scan base-package="dao"/> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    ... 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    ... 
</bean> 



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

ответ

0

Первый вопрос: HibernateSession является первым кэшем уровня, данные не будут сохранены (в базе данных), пока сессия не будет закрыта (Tipically в транзакции), но данные подъезд для некоторых запросов. This link explain it very well.

Второй вопрос: Вы запрашиваете текущий HibernateSession, но возможно, что он недоступен, поскольку он не был создан или открыт.

По моему личному мнению, это не лучший способ интегрировать Spring и Hibernate, я думаю, вы должны использовать HiberanteTemplate, может быть, это tutorial поможет вам.

+0

Но даже когда я закрываю все свой проект и закрываю затмение, объект не сохраняется! Я знаю, что с шаблоном спящего режима лучше, но я хочу знать, с чего проблема возникает в первую очередь. – Youssef

+0

вы закрыли HibernateSession (session.close()) ?? В любом случае, я не уверен, как hibernate управляет AUTO_COMMIT, но вы должны работать с транзакционными отметками. HibernateTemplate дает вам простые (и безопасные) способы использования HibernateSesion. Пример (только спящий режим) 'Session sess = factory.openSession(); Сделка tx; try { tx = sess.beginTransaction(); // Производим некоторые работы ... tx.commit(); } catch (исключение e) { if (tx! = Null) tx.rollback(); throw e; } finally { sess.close(); } ' – djvazquez

+0

' session.close() 'не работает. но 'session.flush()' работает, даже если я удалю все элементы '@ Transactional' и' transactionManager', я действительно запутался. – Youssef

0

это работа теперь я забыл поставить

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

и я поставил

sessionFactory.getCurrentSession(); 

это похоже на работу после tx:annotation-driven sessionFactory.openSession() не открывает правую сессию я думаю.

но может ли кто-нибудь объяснить мне, почему?

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