2012-07-04 3 views
0

У меня проблема с Hiberante и Spring.Конфигурация спящего и весеннего сеанса

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

Это моя конфигурация

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan"> 
     <list> 
      <value>com.cinebot.db.entity</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

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

Это мой дао:

@Transactional 
public class Dao { 


    @Autowired 
    private SessionFactory sessionFactory; 

    public Session getSession(){ 
     return sessionFactory.getCurrentSession(); 
    } 

    @SuppressWarnings("unchecked") 
    public <T> T get(Class<T> classe, Serializable id) throws Exception { 
     if(id==null) return null; 
     T obj = (T) getSession().get(classe, id); 
     return obj; 
    } 

}

и это, где я получаю сообщение об ошибке (getEventi() лениво загрузится) внутри @Service класс:

Spettacoli spettacolo = dao.get(Spettacoli.class, spettacoloId); 
    if(spettacolo.getEventi().getScadenza()>0) throw new LogicalException("Spettacolo scaduto"); 
+0

Где вы обращаетесь к свойствам объекта? –

+0

в классе @Service сразу после получения этой сущности с getSession(). Get() – Tobia

+0

Можете ли вы показать код метода службы здесь, включая метод dao? Нужно взглянуть на аннотацию транзакции –

ответ

1

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

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

Помните, что вам необходимо начать транзакцию в сервисе, а не DAO, которая позволит вам получить доступ к дочерним объектам. Поэтому переместите аннотацию @transactional к вашему методу обслуживания.

+0

Спасибо Сунил, но у меня есть еще вопрос. Если мне нужно ленивое свойство в моем контроллере (например), я должен добавить Transactional и там? – Tobia

+0

Нет. Вы должны использовать объекты переноса там. См. Соглашения по дизайну, которые вы никогда не должны переносить своей сущностью в контроллер, но использовать объекты переноса для переноса информации о сущности. Перенос объектов (TO) - это просто java beans, которые будут содержать обязательные поля из объекта. Этот TO будет заселен в методе обслуживания –

+0

Хорошо, спасибо вам большое! – Tobia

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