2017-02-07 4 views
3

Rolle zu initialisieren Ich habe One-To-Many Beziehung, hier mein CodeInhalt nicht schreiben kann: failed faul, um eine Sammlung von

@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", [email protected](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 
} 

ist und ich bin die Ausnahme bekommen:

org .springframework.http.converter.HttpMessageNotWritableException: kann nicht Inhalte schreiben: failed lazily eine Sammlung von Rolle zu initialisieren: com.example.helios.model.Catalog.items, nicht Proxy initialisiert werden konnte - keine Session; verschachtelte Ausnahme ist com.fasterxml.jackson.databind.JsonMappingException: failed zu träge eine Sammlung von Rolle initialisieren: com.example.helios.model.Catalog.items, konnte nicht Proxy initialisieren - keine Sitzung 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 (HttpEnt ityMethodProcessor.java:183) org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue (HandlerMethodReturnValueHandlerComposite.java:80) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle (ServletInvocableHandlerMethod.java: 126)

Meine Versionen ist:

  • spring 4.2.4.RELEASE
  • Hibernate 4.3.11.Final
  • Jackson 2.7 0,4
  • Jacksontype 2.7.1

Antwort

10

Dies ist das normale Verhalten Hibernate

In einer zu viele Beziehungen, Hibernate lädt den Vater Entität (Katalog in Ihrem Fall), aber es wird die Kinder Entitäten Liste laden (Listenelemente und Liste Aufträge in Ihrem Fall) in einem LAZY Modus

Dies bedeutet, dass Sie nicht auf diese Objekte zugreifen können, weil sie nur Proxies sind und nicht reale Objekte

Dies ist sehr nützlich, um lo zu vermeiden Anzeige die vollständige DB wenn führen Sie eine Abfrage

Sie haben 2-Lösung:

  1. laden Kinder Entitäten in EAGER Modus (I stark schlagen vor, Sie es nicht zu tun, weil die komplette DB laden ... Aber es ist etwas mit Ihrem Szenario verbunden
  2. Sie nicht in Ihrem JSON die untergeordneten Elemente mit dem com.fasterxml.jackson.annotation serialisieren.JsonIgnore Eigenschaft

Angelo

+0

Danke, Lösung # 1 für mich gearbeitet. – KostasC

+0

Lösung # 2 arbeitete für mich wie ein Charme! Prost! –

+0

aber die zweite Lösung ist statisch .. in einem Projekt brauchen wir manchmal die zugehörigen Entitäten und manchmal nein. Dieser EntityManager-Lebenszyklus mit der automatischen Serialisierung im Frühjahr ist eine schreckliche Falle. –

2

Eine dritte Option, die nützlich sein können, wenn Sie wollen alles EAGER Modus und laden nicht verwenden ist Hibernate verwenden :: initialisieren und nur zu laden, was Sie brauchen.

Session session = sessionFactory.openSession(); 
Catalog catalog = (Catalog) session.load(Catalog.class, catalogId); 
Hibernate.initialize(shelf); 

More information

+0

Ja ... Sie haben Recht ... Ich habe es vergessen; aber Sie müssen immer im Winterschlaf sein –

+1

@AngeloImmediata In der Tat ist es nicht der praktischste. Wird verwendet, wenn Eager zu viel Leistung hat. – otonglet

+0

ich stimme völlig mit dir :) –

Verwandte Themen