簡體   English   中英

休眠中的雙向關系問題

[英]Problems with bidirectional relationship in hibernate

我有兩個實體:Sale和SaleProduct。

我正在嘗試保留Sale實體,但是我不知道如何為其提供服務,因為總是試圖保存Sale ir總是需要SaleProduct。

這是Sale實體:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sale {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    @NotNull(message = "Sale product!")
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "SALE_ID")
    private List<SaleProduct> products;

    @NotNull(message = "Sale needs some value!")
    private int saleValue;

    private Date creationDate = new Date();

}

這是SaleProduct實體:

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class SaleProduct {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    private int quantity;

    @NotNull(message = "Insert the product, please")
    @ManyToOne(fetch = FetchType.EAGER)
    private Product product;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Sale sale;

}

我正在嘗試通過這種方法堅持銷售:

    public void insertSale(Sale sale) throws Exception {
        Product product = manager.find(Product.class, 2L);
        SaleProduct saleProduct = new SaleProduct();
        saleProduct.setProduct(product);
        sale.setProducts(Arrays.asList(saleProduct));
        saleProduct.setSale(sale);
        manager.persist(sale);
    }

我正在發送此JSON:

{
    "saleValue" : "200"
}

當我嘗試選擇創建的銷售時,出現以下錯誤:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.tax.entity.Sale.products, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.tax.entity.Sale["products"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:210)
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:177)
at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:190)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:674)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContentsUsing(CollectionSerializer.java:160)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:102)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:251)
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:846)
at org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider.writeTo(ResteasyJackson2Provider.java:207)
at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.writeTo(AbstractWriterInterceptorContext.java:131)
at org.jboss.resteasy.core.interception.ServerWriterInterceptorContext.writeTo(ServerWriterInterceptorContext.java:60)
at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:120)
at org.jboss.resteasy.security.doseta.DigitalSigningInterceptor.aroundWriteTo(DigitalSigningInterceptor.java:145)
at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:124)
at org.jboss.resteasy.plugins.interceptors.encoding.GZIPEncodingInterceptor.aroundWriteTo(GZIPEncodingInterceptor.java:100)
at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:124)
at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:98)
at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:466)
... 33 more

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.tax.entity.Sale.products, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:567)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:205)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:146)
at org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:261)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:88)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666)
... 50 more

另一個問題:當我saleProduct.setSale(sale); 我收到此異常:com.sun.jdi.InvocationException發生了調用方法

為了完成雙向映射,您必須在OneToMany批注中具有“ mappedBy”屬性

在實體銷售中使用

@OneToMany(mappedBy="product", cascade=cascadeType.ALL, fetch=fetchType.LAZY)
  1. @JoinColumn批注必須在關系的關聯側,也就是說,它應該在@ManyToOne批注中:

     @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "SALE_ID") private Sale sale; 
  2. 所述mappedBy屬性必須被放置在逆側,即其中@OneToMany使用注釋:

     @OneToMany(mappedBy="sale" cascade = CascadeType.ALL, fetch = FetchType.EAGER) private List<SaleProduct> products; 
  3. 創建一個Sale的實例,例如sale

  4. 創建一個SaleProduct實例,例如saleProduct

  5. saleProduct添加到列表products (即使列表中包含SaleProduct我也不知道為什么命名該列表products )。

  6. sale分配給saleProductsaleProduct.setSale(sale) 現在,兩個實體實例都連接在一起。

  7. 最后堅持: entityManager.persist(sale);

作為例外

No validator could be found for constraint 'javax.validation.constraints.Size' validating type 'com.tax.entity.Product'. Check configuration for 'product'

因此,從“ product ”字段中刪除@Size ,因為它不是一個收集字段。 您可以將其放在"Sale.products"關系的另一側

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM