N'a pas pu écrire du contenu: échec paresseusement initialiser une collection de rôle
J'en ai Une-À-Plusieurs relation, voici mon code
@Entity
@Table(name = "catalog")
public class Catalog {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "catalog_id")
private int catalog_id;
@NotEmpty
@Size(min = 3, max = 255)
@Column(name = "name", nullable = false)
private String name;
@OneToMany(mappedBy="mycatalogorder")
private List<Order> orders;
@OneToMany(mappedBy="mycatalog")
private List<CatalogItem> items;
//setters and getters
}
@Entity
@Table(name = "catalogitem")
public class CatalogItem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "catalogitem_id")
private int catalogitem_id;
@NotEmpty
@Size(min = 3, max = 255)
@Column(name = "name", nullable = false)
private String name;
@NotEmpty
@Column(name = "price", nullable = false)
private Double price;
@OneToOne(mappedBy="ordercatalogitem", cascade=CascadeType.ALL)
private OrderItem morderitem;
@ManyToOne
@JoinColumn(name="catalog_id", nullable=false)
private Catalog mycatalog;
//setters and getters
}
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "order_id")
private int order_id;
@NotEmpty
@Size(min = 3, max = 255)
@Column(name = "name", nullable = false)
private String name;
@NotEmpty
@Size(min = 3, max = 1024)
@Column(name = "note", nullable = false)
private String note;
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(pattern = "ddmmYYYY HH:mm:ss")
@Column(name = "created", nullable = false)
private Date created;
@OneToMany(mappedBy="myorder")
private Set<OrderItem> orderItems;
@ManyToOne
@JoinColumn(name="catalog_id", nullable=false)
private Catalog mycatalogorder;
@PrePersist
protected void onCreate() {
created = new Date();
}
//setters and getters
}
@Entity
@Table(name = "orderitem")
public class OrderItem {
@Id
@Column(name="catalogitem_id", unique=true, nullable=false)
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="catalogitem"))
private int catalogitem_id;
@Column(name = "quantity")
private int quantity;
@OneToOne
@PrimaryKeyJoinColumn
private CatalogItem ordercatalogitem;
@ManyToOne
@JoinColumn(name="order_id", nullable=false)
private Order myorder;
//setters and getters
}
Et je suis l'exception:
org.springframework.http.convertisseur de.HttpMessageNotWritableException:
N'a pas pu écrire du contenu: échec paresseusement initialiser une collection de
rôle: com.exemple.helios.de modèle.De catalogue.articles, n'a pas pu initialiser
proxy - pas de Session; nested exception est
com.fasterxml.jackson.databind.JsonMappingException: échec paresseusement
initialiser une collection de rôle:
com.exemple.helios.de modèle.De catalogue.articles, n'a pas pu initialiser proxy -
pas de Session
org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:271)
org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:100)
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:222)
org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:183)
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:80)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126)
Mes versions:
- SpringFramework 4.2.4.COMMUNIQUÉ de
- Hibernate 4.3.11.Final
- Jackson 2.7.4
- Jacksontype 2.7.1
OriginalL'auteur KostasC | 2017-02-07
Vous devez vous connecter pour publier un commentaire.
C'est normal Hibernate comportement
Dans l'une de beaucoup de relations, hibernate charge le père de l'entité (Catalogue dans votre cas), mais il va charger les enfants de la Liste des entités (les éléments de la Liste et de la Liste des commandes dans votre cas) dans un PARESSEUX mode
Cela signifie que vous ne pouvez pas accéder à ces objets, car ils sont juste des procurations et non pas des objets réels
C'est utile afin d'éviter de charger le plein DB lorsque vous exécutez une requête
Vous avez 2 solution:
Angelo
Solution n ° 2 a fonctionné pour moi comme un charme! Cheers!
mais la deuxième solution est statique.. dans un projet, nous avons besoin parfois les entités liées et parfois pas. Cette EntityManager du cycle de vie des avec la la sérialisation automatique effectué par le printemps est un terrible piège.
OriginalL'auteur Angelo Immediata
Une troisième option, qui peut être utile si vous ne souhaitez pas utiliser DÉSIREUX mode et de la charge, tout est à utiliser Hibernate::initialize et charger uniquement ce dont vous avez besoin.
Plus d'informations
En effet, ce n'est pas la plus pratique. Pour être utilisé lors de la HÂTE a trop d'impact sur les performances.
je suis totalement d'accord avec vous 🙂
OriginalL'auteur otonglet
J'ai eu le même problème, mais un fixe par:
vous pouvez avoir plus d'informations ici: https://vladmihalcea.com/the-best-way-to-handle-the-lazyinitializationexception/
OriginalL'auteur Cruz Ortiz
Je pense que la meilleure solution à votre problème (qui est aussi la plus simple) est de définir votre FetchType de PARESSEUX et simplement annoter le oneToMany champs de la collection à l'aide de @transitoire.
Réglage FetchType à la HÂTE n'est pas une bonne idée, la plupart du temps.
Le meilleur de la chance.
OriginalL'auteur Christian Nwafor