2016-06-23 2 views
0

У меня есть два объекта: Продажа и продажаПродукция.Проблемы с двунаправленными отношениями в спящем режиме

Я пытаюсь сохранить объект Sale, но я не знаю, как сделать ему сервис, потому что всегда, что я пытаюсь сохранить 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); 
    } 

I я отправляю этот 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 Я добавил erros, который я получаю. –

ответ

0

для выполнения двунаправленного отображения, вы должны иметь свойство «mappedBy» в OneToMany аннотацию

в объекте Продажа использования

@OneToMany(mappedBy="product", cascade=cascadeType.ALL, fetch=fetchType.LAZY) 
+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. Назначить: sale - saleProduct: saleProduct.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

Что вы сказали правильно. Я не буду голосовать за этот ответ, потому что это не цель моего вопроса. Но большое спасибо, это мне очень поможет! –

Смежные вопросы