2015-05-25 2 views
1

получать org.hibernate.LazyInitializationException: не удалось инициализировать прокси - не сессии , когда я называю findByUserEmail (String электронной почты)LazyInitializationException при использовании присоединиться CrudRepository

Сервис класса (где я звоню эта функция) отмечен как @Transactional

Repository

@Repository 
public interface UserImagesRepository extends CrudRepository<User_images, Integer> { 
    List<User_images> findByUserEmail(String email); 
} 

пользователя

@Entity 
@Table(name = "users") 
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u") 
public class User implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    private String email; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
    private Set<User_images> images = new HashSet<User_images>(0); 

    //getters and setters 
} 

User_images

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

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "userId") 
    private User user; 

    // getters and setters 
} 

___UPDATE___

UserImageRepository имеет no, запросы автоматически генерируются из имени метода напрямую. docs

Я не хочу использовать нетерпеливую загрузку как свою плохую практику.

+0

Можете ли вы поделиться внедрением метода findByUserEmail (String email)? – Manish

+0

FetchType.Lazy означает, что выборка при необходимости, поэтому, когда вы вызываете 'findByUserEmail (String email)', если в этом fuction вы извлекаете некоторую вещь, связанную с другой таблицей после вызова метода службы, это приведет к исключению LazyInitailzation как сеансу закрывается. Заменяя с помощью fetch = FetchType.Eager все места, он должен работать. 1.http: //javarevisited.blogspot.in/2014/04/orghibernatelazyinitializationException-Could-not-initialize-proxy-no-session-hibernate-java.html 2.http: // uaihebert.com/four-solutions-to-the-lazyinitializationexception/ –

+0

Является ли исключение в методе 'findByUserEmail'? Возможно, ваш стек поможет нам или даже реальный код в этом методе. – DuncanKinnear

ответ

1

Всякий раз, когда вы видите что-то вроде org.hibernate.LazyInitializationException: could not initialize proxy - no Session, это из-за того, что вы пытаетесь получить доступ к ленивой загрузке за пределами границ транзакции.

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

В большинстве случаев вы пытаетесь получить доступ к ленивой загрузке за пределами, где вы объявили транзакцию. Например, может быть один контроллер, вызывающий вашу службу (ваша служба - это место, где объявлена ​​граница транзакции), а в контроллере вы делаете что-то вроде user.getImages(). Вы должны убедиться, что вы уже загрузили изображения перед возвратом из Сервиса. (Есть несколько других способов, например «Open Session In View», но это никогда не было моим предпочтительным решением).

Такого рода ленивым доступа к свойству не может быть явным, например, это может быть вызвано вы вызываете toString() из User из-за лесозаготовки, или вы используете отладчик для проверки содержимого User.

Рекомендации по теме: убедитесь, что вы соблюдаете соглашение Java в именовании. Он должен быть UserImage вместо User_images