2016-06-23 84 views
0

我有兩個實體:Sale和SaleProduct。休眠中雙向關係的問題

我試圖堅持銷售實體,但我不知道如何向它提供服務,因爲我總是嘗試保存Sale ir需要SaleProduct。

這是銷售實體:

@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調用方法

+1

你能告訴我們錯誤信息嗎? –

+0

@Paul當然。對不起,忘了它。明天我會在這裏粘貼錯誤並改善問題。 –

+0

@PaulWasilewski我添加了我得到的錯誤。 –

回答

0

爲了實現雙向映射,你得有在實體銷售使用

在OneToMany註釋

「的mappedBy」屬性

+0

你能再次讀到這個問題嗎?我改變了@ujulu給出的答案 –

0
  1. @JoinColumn註釋必須在onwing側的關係,也就是說,它應該是對@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。 (我不知道你爲什麼給列表products命名,即使它包含SaleProduct s)。

  6. 指定salesaleProductsaleProduct.setSale(sale)。現在兩個實體實例都連接在一起。

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

+0

不成功。我更新了這個問題。你可以檢查它嗎? –

+0

我看到你的評論太遲了。無論如何,看來你的問題沒有解決;如果我正確地理解了上面的評論,現在映射也應該是確定的。 – ujulu

+0

是啊@ujulu我只是得到一些錯誤來獲取數據,但這是另一個歷史。非常感謝。 –

0

由於異常說

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

所以從外地 「產品」 刪除@Size,因爲它不是一個集合場。你可以把它放在關係的另一邊"Sale.products"

+0

你說的是對的。我不會投票接受這個答案,因爲這不是我問題的目的。 但是非常感謝,它會幫助我很多! –