2016-05-30 3 views
0
//i use ajax, spring mvc , hibernate-jpa 

я получаю эти журнал ошибок при просмотре страницыНевозможно записать содержание: не удалось инициализировать прокси - не сессии

Etat HTTP 500 - Не могу записать содержание: не удалось лениво инициализировать коллекцию роли: орг .service.pf.entities.Categorie.souscategorie, не удалось инициализировать прокси - нет сеанса (через цепочку ссылок: java.util.ArrayList [0] -> org.service.pf.entities.Souscategorie ["категоризация"] -> org .service.pf.entities.Categorie [ "souscategorie"]); Вложенное исключение - com.fasterxml.jackson.databind.JsonMappingException: не удалось лениво инициализировать коллекцию роли: org.service.pf.entities.Categorie.souscategorie, не удалось инициализировать прокси - нет сеанса (через цепочку ссылок: java.util. ArrayList [0] -> org.service.pf.entities.Souscategorie [ "Категория"] -> org.service.pf.entities.Categorie [ "souscategorie"])

//my controller 

    @RequestMapping(value="/filtrecatgajax") 
    @ResponseBody 
    public List<Souscategorie> getAllProductByKategori(@RequestParam(value = "id", required = true) String id ){ 

    return metiersr.SouscategoriesParCategorie((long) Integer.parseInt(id)); 
} 

//My dao function 

public class ServicedaoImpl implements Servicedao { 
@PersistenceContext 

    @Override 
    public List<Souscategorie> SouscategoriesParCategorie(Long idCat) { 
    Query query = em 
      .createQuery("SELECT p FROM Souscategorie p WHERE p.categorie.id=:x"); 
    query.setParameter("x", idCat); 
    return query.getResultList(); 

} 
} 

//Relation OneToMany 

     @OneToMany(mappedBy = "categorie") 
     private Collection<Souscategorie> souscategorie; 

//Relation ManyToOne 

     @ManyToOne 
     @JoinColumn(name = "categorie_id") 
     private Categorie categorie; 

    Can someone help me ! 

ответ

0

Вы пытаетесь получить доступ к коллекции из сеанса гиберната. Постарайтесь определить ваше отношение, как

@OneToMany(mappedBy = "categorie", fetch = FetchType.EAGER) 

поэтому данные будут загружены один загружаемой родительский объект

+0

с @OneToMany (mappedBy = "категори", fetch = FetchType.EAGER) У меня есть бесконечная рекурсия с Jackson JSON! – Raki

+0

Вы можете попытаться использовать @JsonIgnore, чтобы остановить цикл рекурсии – Stan

+0

Что делать, если мы хотим использовать тип выборки как ленивый? – masSdev

1

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

Я использую Spring MVC 4, Hibernate 4, Spring Rest

Постановка задачи

Я хотел получить Answer_tbl Entity объект из базы данных, но я получаю исключение

не удалось записать содержание: не удалось инициализировать прокси - не сессии через эталонным цепи

Мой ответ Entity Класс

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

    @Id 
    @Column(name = "AnswerId") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    @JoinColumn(name="QuestionId") 
    private Question_tbl question; 

    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    @JoinColumn(name="ShaikhId") 
    private Shaikh_tbl shaikh; 

    // getters and setters 

Когда я назвал обслуживание http://localhost:8080/myapp/rest/answer/2, получил такое же исключение, как ваша.

Проблема на самом деле FetchType.lazy. Джексон пытается преобразовать объект Answer_tbl, он пытается загрузить связанные объекты (Question_tbl & Shaikh_tbl), но сеанс спящего режима закрыт.

Решение

Одним из решений является удаление fetch = FetchType.LAZY, затем спящий режим будет загружать ассоциации с нетерпением. Но это не то, что вы ищете.

Второе решение - использовать процессор Jackson JSON, который может работать с функциями ленивой загрузки.

Вот шаги

Добавить следующую Maven зависимость

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-hibernate4</artifactId> 
    <version>2.5.3</version> 
</dependency> 

Регистрация модуль с ObjectMapper

public class HibernateAwareObjectMapper extends ObjectMapper { 

    public HibernateAwareObjectMapper() { 
     registerModule(new Hibernate4Module()); 
    } 

} 

Добавьте следующий код в Spring XML Config

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <!-- Use the HibernateAware mapper instead of the default --> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper"> 
       <bean class="path.to.your.HibernateAwareObjectMapper" /> 
      </property> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

Теперь, когда я позвонил в службу http://localhost:8080/myapp/rest/answer/2, я получил следующий JSON. Не получена ассоциация, доступен только объект Answer_tbl.

{ 
    "id": 2, 
    "question": null, 
    "shaikh": null, 
    "solution": "testing...", 
} 

Вот ссылка Git FasterXML-Jackson-Datatype-Hibernate

Надеется, что это было бы полезно.

+0

Это работает! но подумайте использовать @JsonIgnore, чтобы остановить циклы рекурсии –

+0

Рад, что мой ответ вам помог :) – STK

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