2014-10-27 3 views
1

Я работаю с весной mvc и используя данные весны jpa, и у меня есть эта ошибка failed to lazily initialize a collection of role could not initialize proxy - no Session Я знаю, что это происходит, потому что у меня нет открытого сессии, но я не знаю, как сохранить свою сессию открытой после того, как я подключиться к базе данных это мой код до сих пор:Не удалось лениво инициализировать коллекцию роли не удалось инициализировать прокси - нет сеанса

Мой JPA класс конфигурации

@Configuration 
@EnableSpringConfigured 
@ComponentScan(basePackages = {"com.abc.domain", "com.abc.repository", "com.abc.service","com.abc.authenticate"}) 
@EnableJpaRepositories(basePackages="com.abc.repository") 
public class ConfigJPA 
{ 

     @Bean 
     public LocalContainerEntityManagerFactoryBean entityManagerFactory() 
       throws ClassNotFoundException 
     { 

      LocalContainerEntityManagerFactoryBean em = 
        new LocalContainerEntityManagerFactoryBean(); 

      em.setDataSource(dataSource()); 
      em.setPackagesToScan("com.abc.domain"); 
      em.setPersistenceProviderClass(HibernatePersistence.class); 
      em.setJpaProperties(asignarPropiedades()); 

      return em; 
     } 

     //Propiedades Hibernate 
     Properties asignarPropiedades() { 

      Properties jpaProperties = new Properties(); 

      jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect"); 
      jpaProperties.put("hibernate.format_sql", true); 
      jpaProperties.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy"); 
      jpaProperties.put("hibernate.show_sql", true); 

      return jpaProperties; 
     } 


     @Bean 
     public DataSource dataSource(){ 

      DriverManagerDataSource dataSource = 
        new DriverManagerDataSource(); 

      dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 

      //farmatodo22 
      dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE"); 
      dataSource.setUsername("DATBASE"); 
      dataSource.setPassword("mypassword"); 

      return dataSource; 
     } 

     @Bean 
     public JpaTransactionManager transactionManager() 
       throws ClassNotFoundException 
     { 

      JpaTransactionManager transactionManager = 
        new JpaTransactionManager(); 

      transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 

      return transactionManager; 
     } 
} 

это мои классы домена класса

Пользователь

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

    private static final long serialVersionUID = 1L; 


    //**PRIMARY KEY**// 

    @Id 
    @SequenceGenerator(name="User_id_seq", sequenceName="SEQ_User") 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="User_id_seq") 
    @Column(name="ID_USER", unique=true, nullable=false, precision=8) 
    private Long idUser; 




    @ManyToOne 
    @JoinColumn(name="id_ldap_server", nullable = false) 
    private ServerLdap serverLdap; 




    @ManyToMany 
    @JoinTable 
    (
     name="Usuario_Rol", 
     joinColumns = 
     { 
     @JoinColumn (name="ID_USER", referencedColumnName="ID_USER") 
     }, 
     inverseJoinColumns = 
     { 
     @JoinColumn (name="id_rol", referencedColumnName="id_rol") 
     } 
    ) 
    private List<Rol> roles; 

Это моя роль класса

@Entity 
    @Table(name="ROL") 
    public class Rol implements Serializable 
    { 

    private static final long serialVersionUID = 1L; 


    //***PRIMARY KEY***/// 

    @Id 
    @SequenceGenerator(name="ROL_ID_GENERATOR", sequenceName="SEQ_ROL") 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ROL_ID_GENERATOR") 
    @Column(name="id_rol", unique=true, nullable=false, precision=8) 
    private Long idRol; 




    @ManyToMany(mappedBy="roles") 
    private List<User> users; 

} 

Я пытаюсь сделать ManyToMany realtion между Пользователем и Рол, эту работу хорошо, если я поставил fetchType = EAGER, но я не хочу использовать этот тип выборки потому что я думаю, что это не эффективно.

+0

Вы, конечно, не хотите, чтобы сделать тип выборки EAGER. Если у вас есть значительное число пользователей, вы наверняка можете убить свое приложение, потому что пользователю обязательно нужно знать их роли. Если Роли также должны знать всех своих Пользователей, любой пользователь, входящий в систему, приведет к загрузке всех Пользователей в базе данных. – user3360944

+0

Недавно я написал блог о весенних сапогах, джерси и данных JPA. Возможно, вам будет интересно прочитать его, http://bit.ly/1vzHYqi – jasenkoh

ответ

1

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

+0

спасибо за ссылку man, я прочитал ссылки, которые вы опубликовали, и кажется, что Open Session in View - плохая практика, поэтому у вас нет других ссылок для решения этой проблемы без использования Open Session in View Pattern? Я думал, что использование весенних данных jpa собиралось сэкономить мне время, но кажется, что только вводят проблемы – stackUser2000

+0

Другой вариант, возможно, использовать весовые бобы с запросом, которые упоминается в одной из статей. Я думаю, что Spring Data определенно очень полезен, вам придется иметь дело с проблемой сеанса в любой используемой вами структуре ORM. – Saket

+0

Я собираюсь прочитать с большим вниманием статьи, но это простой способ исправить эту проблему, потому что я новичок в Spring mvc framework и весенних jpa-данных и спящем режиме, и я забыл упомянуть, что у меня нет ничего, что связано с сессий или чего-либо с аннотацией @transaction во всем моем приложении, чему я должен сначала научиться? – stackUser2000

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

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