2016-06-23 85 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

你说的是对的。我不会投票接受这个答案,因为这不是我问题的目的。 但是非常感谢,它会帮助我很多! –