2017-02-07 60 views
3

我有一個一對多的關係的集合,這裏是我的代碼無法寫入內容:無法懶洋洋地初始化角色

@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 
} 

而且我得到異常:

組織.springframework.http.converter.HttpMessageNotWritableException: 無法寫入內容:無法長時間初始化集合 角色:com.example.helios.model.Catalog.items,無法初始化 proxy - no Session;嵌套的例外是 com.fasterxml.jackson.databind.JsonMappingException:無法懶洋洋地初始化 角色的集合: com.example.helios.model.Catalog.items,無法初始化代理 - 無會話 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)

我的版本是:

  • springframework的4.2.4.RELEASE
  • 休眠4.3.11.Final
  • 傑克遜2.7 0.4
  • Jacksontype 2.7.1

回答

10

這是正常的休眠行爲

在一對多的關係,休眠加載父親實體(在你的案件目錄),但它會載入兒童實體名單在一個慵懶的模式(列表項和List命令你的情況)

這意味着你不能訪問這些對象,因爲他們只是代理,而不是實物

這是有用的,以避免LO廣告全DB當你執行一個查詢

你有2個解決方案:

  1. 負載兒童實體EAGER模式(我強烈建議你這樣做,因爲你可以加載完整DB ...但它與你的場景有關
  2. 你不能通過使用com.fasterxml.jackson.annotation在你的JSON中序列化子實體。JsonIgnore財產

安傑洛

+0

謝謝,解決方案#1爲我工作。 – KostasC

+0

解決方案#2爲我工作就像一個魅力!乾杯! –

+0

但第二個解決方案是靜態的..在一個項目中,我們有時需要相關實體,有時不需要。這個EntityManager生命週期與春季完成的自動序列化是一個可怕的陷阱。 –

2

,如果你不希望使用EAGER模式,並加載了一切可以是有用的第三個選項是使用Hibernate ::初始化並只加載你所需要的。

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

More information

+0

是的......你是對的......我忘了它;但你必須始終在休眠會話 –

+1

@AngeloImmediata事實上它不是最實用的。在EAGER對性能影響太大時使用。 – otonglet

+0

我完全同意你:) –

相關問題