не удалось лениво инициализировать коллекцию role @Transactional и @LazyCollection (LazyCollectionOption.ИСТИННЫЙ)

Я знаю, что этот вопрос задавался много раз, но я не понимаю !

I get Failed to write HTTP message: org.springframe.http.конвертер.HttpMessageNotWritableException: не удалось записать содержимое: не удалось лениво инициализировать коллекцию role: com.Политех.модели.UserEntity.likesByUserId, не удалось инициализировать прокси-нет сессии; когда я пытаюсь получить нравится пользователю.

Вот мои сущности :

/**
 * Created by sydne on 11/01/2017.
 */
@Entity
@Table(name = "user", schema = "placetosee", catalog = "")
public class UserEntity {
    private Integer userId;
    private String nom;
    private String prenom;
    private String hashedPassword;
    private String email;
    private Date dateNaiss;
    private List<LikeEntity> likesByUserId ;
    private List<PreferencesEntity> preferencesByUserId;
    private List<VisiteEntity> visitesByUserId;

    @Id
    @Column(name = "user_id", nullable = false)
    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    @Basic
    @Column(name = "nom", nullable = false, length = 50)
    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    @Basic
    @Column(name = "prenom", nullable = false, length = 50)
    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    @Basic
    @Column(name = "hashed_password", nullable = false, length = 1000)
    public String getHashedPassword() {
        return hashedPassword;
    }

    public void setHashedPassword(String hashedPassword) {
        this.hashedPassword = hashedPassword;
    }

    @Basic
    @Column(name = "email", nullable = false, length = 100)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Basic
    @Column(name = "date_naiss", nullable = false)
    public Date getDateNaiss() {
        return dateNaiss;
    }

    public void setDateNaiss(Date dateNaiss) {
        this.dateNaiss = dateNaiss;
    }

    @JsonIgnore
    @LazyCollection(LazyCollectionOption.TRUE)
    @OneToMany( mappedBy = "byUserEntity",cascade = CascadeType.ALL)
    public List <LikeEntity> getLikesByUserId() {
        return likesByUserId;
    }

    public void setLikesByUserId(List<LikeEntity> likesByUserId) {
        this.likesByUserId = likesByUserId;
    }

    @JsonIgnore
    @LazyCollection(LazyCollectionOption.TRUE)
    @OneToMany( mappedBy = "byUserEntity",cascade = CascadeType.ALL)
    public List<PreferencesEntity> getPreferencesByUserId() {
        return preferencesByUserId;
    }

    public void setPreferencesByUserId(List<PreferencesEntity> preferencesByUserId) {
        this.preferencesByUserId = preferencesByUserId;
    }

    @JsonIgnore
    @LazyCollection(LazyCollectionOption.TRUE)
    @OneToMany( mappedBy = "byUserEntity",cascade = CascadeType.ALL)
    public List<VisiteEntity> getVisitesByUserId() {
        return visitesByUserId;
    }

    public void setVisitesByUserId(List<VisiteEntity> visitesByUserId) {
        this.visitesByUserId = visitesByUserId;
    }

    public void addPrererence (PreferencesEntity preference) {
        getPreferencesByUserId().add(preference);
    }

    public void deletePreference (PreferencesEntity preference ) {
        getPreferencesByUserId().remove(preference);
    }
}

А мне нравится

    @Entity
@Table(name = "like", schema = "placetosee", catalog = "")
public class LikeEntity implements Serializable {


    @EmbeddedId
    private LikeEntityPK id;

    private Byte isLiking;

    public LikeEntityPK getId() {
        return id;
    }

    public void setId(LikeEntityPK id) {
        this.id = id;
    }

    //bi-directional many-to-one association to Lieu
    @ManyToOne
    @JoinColumn(name="lieu_id",referencedColumnName ="lieu_id" ,insertable =false,updatable = false, nullable = false)
    private LieuEntity byLieuEntity;

    //bi-directional many-to-one association to User
    @ManyToOne
    @JoinColumn(name="user_id", referencedColumnName ="user_id", insertable =false,updatable = false, nullable = false)
    private UserEntity byUserEntity;


    @Basic
    @Column(name = "is_liking", nullable = false)
    public Byte getIsLiking() {
        return isLiking;
    }

    public void setIsLiking(Byte isLiking) {
        this.isLiking = isLiking;
    }

    public void setLieuByLieuId(LieuEntity lieuByLieuId) {
        this.byLieuEntity= lieuByLieuId;
    }
}

Вот мой контроллер :

    @RequestMapping(value="/like")
    @RestController
    @Transactional
    public class LikeController {

        @Autowired
        public LikeDAO _likeDao ;

        // localhost:8080/like/getlikes?user_id=2
        @RequestMapping(value = "/getlikes")
        @Produces(MediaType.APPLICATION_JSON)
        public @ResponseBody List  <LikeEntity> getUserLikes(@RequestParam int user_id) {
           return _likeDao.getLikeByUserId(user_id);
        }

}

И, наконец, мой Дао :

@Service
@Transactional
public class LikeDAO {

    @Autowired
    private LocalSessionFactoryBean _sessionFactory;

    @Autowired
    public UserDAO _userDao;

    private Session getSession() {
        return _sessionFactory.getObject().getCurrentSession();
    }


    public List<LikeEntity> getAll() {
        return getSession().createQuery("from LikeEntity ").list();
    }


    public List<LikeEntity> getLikeByUserId (int user_id) {
       return _userDao.getById(user_id).getLikesByUserId();
    }

    public List<LikeEntity> getLikesForUser (int user_id) {
        //return getSession().
    }

    public void save(LikeEntity like) {
        getSession().save(like);

    }

    public LikeEntity getById(int user_id, int lieu_id) {
        LikeEntityPK id = new LikeEntityPK();
        id.setUserId(user_id);
        id.setLieuId(lieu_id);
        return getSession().get(LikeEntity.class, id);
    }

    public void delete (LikeEntity like) {
        getSession().delete(like);
    }
}

Пожалуйста, кто-нибудь может мне помочь ?

2 ответа

  1. По умолчанию для всех объектов коллекции и карты используется правило выборки(JPA)FetchType.LAZY
    (Hibernate @LazyCollection), @OneToManyа @ManyToManyотношения не извлекают связанные объекты (коллекции). Необходимо инициализировать связанные сущности в DAO или запросить их с помощью FetchMode, например @Fetch(FetchMode.JOIN)etc… но если вы используете запрос join, он будет дублировать ваш результат ofc, поэтому вы должны отличить свой результат.

  2. Весной нельзя использовать @Transactional в Spring MVC Controller. — Пожалуйста, проверьте здесь Весенний форум

    Вы должны реализовать интерфейс, который Spring может использовать в качестве прокси-интерфейса — как показано ниже

    @Controller
    public interface LikeInterface {
       List<LikeEntity> getUserLikes(int user_id);
    }
    
    @RestController
    @RequestMapping(value="/like")
    public class LikeController implements LikeInterface{
    
        @RequestMapping(value = "/getlikes")
        @Produces(MediaType.APPLICATION_JSON)
        public @ResponseBody List  <LikeEntity> getUserLikes(@RequestParam int user_id) {
           return _likeDao.getLikeByUserId(user_id);
        }
    }