Hibernate OneToMany - это PersistentBag вместо List - PullRequest
0 голосов
/ 14 мая 2018

Я разрабатываю приложение в javafx, которое подключается через RMI с EAR.Этот EAR подключается к базе данных SQLServer и сопоставляет POJOS с использованием hibernate.

Эти POJOS содержат двунаправленные отношения OneToMany и ManyToOne.Как следствие, эти отношения отображаются в виде списка.

Company.java

@Entity
@Table(name = "Company")
public class Company implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@Column(name="id_company",nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

@OneToMany(mappedBy = "company",cascade = CascadeType.ALL )
@ElementCollection
private List<Client> Clients;

//GETTERS&SETTERS   

}

Client.java

@Entity
@Table(name = "Client")
public class Client implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@Column(name="id_client",nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; 

@ManyToOne
private Company company;

//GETTERS&SETTERS   

}

Когда я выполняю это, T является Компанией:

public default T selectById(Serializable id, Class<T> entityClass,Session session)throws HibernateException {
    T obj = null;
    obj = session.get(entityClass, id);
    return obj;
}

Результатом является POJO со всей соответствующей информацией, но в режиме отладки смотрите это:

https://i.stack.imgur.com/eJm7K.png

Объект успешно создан, и мое настольное приложение получает его отлично, но если объект снова отправил его на сервер, используя метод, который получает в качестве параметра объект Company, то у меня появляется эта Ошибка.

javax.ejb.EJBException: java.io.StreamCorruptedException: serialVersionUID does not match!
at org.jboss.as.ejb3.remote.AssociationImpl.receiveInvocationRequest(AssociationImpl.java:128)
at org.jboss.ejb.protocol.remote.EJBServerChannel$ReceiverImpl.handleInvocationRequest(EJBServerChannel.java:450)
at org.jboss.ejb.protocol.remote.EJBServerChannel$ReceiverImpl.handleMessage(EJBServerChannel.java:188)
at org.jboss.remoting3.remote.RemoteConnectionChannel.lambda$handleMessageData$3(RemoteConnectionChannel.java:430)
at org.jboss.remoting3.EndpointImpl$TrackingExecutor.lambda$execute$0(EndpointImpl.java:926)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Caused by: java.io.StreamCorruptedException: serialVersionUID does not match!
    at org.jboss.marshalling.AbstractClassResolver.resolveClass(AbstractClassResolver.java:108)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadClassDescriptor(RiverUnmarshaller.java:1025)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1354)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:275)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:223)
at org.jboss.marshalling.river.RiverUnmarshaller.readFields(RiverUnmarshaller.java:1856)
at org.jboss.marshalling.river.RiverUnmarshaller.doInitSerializable(RiverUnmarshaller.java:1769)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1397)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:275)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:208)
at org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:41)
at org.jboss.ejb.protocol.remote.EJBServerChannel$RemotingInvocationRequest.getRequestContent(EJBServerChannel.java:805)
at org.jboss.as.ejb3.remote.AssociationImpl.receiveInvocationRequest(AssociationImpl.java:126)
... 7 more
Caused by: an exception which occurred:
    in field com.persistence.pojo.Company.Clients
in object com.persistence.pojo.Company@47368172
in object of type com.persistence.pojo.Company

Я использую сервер Wildfly10.x.Версия hibernatecore - 5.2.17. Final

Мне очень жаль, если это очень плохо объяснено, но проект довольно сложный, по сути, мне потребуется hibernate, чтобы отобразить объект List, а не Persistentbag..

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

В вашей Client сущности вам нужно сгенерировать динамический serialVersionUID, сгенерируйте такой как

private static final long serialVersionUID = -558553967080513790L;

В этой ссылке вы можете увидеть как сгенерировать serialVersionUID.Для получения дополнительной информации см. ответ .

0 голосов
/ 14 мая 2018

Проблема здесь в том, что объект, который вы получаете из hibernate, имеет некоторый прокси-класс hibernate, а не ваш реальный класс сущностей.Это нормальное поведение для спящего режима.Этот прокси-класс генерируется автоматически, как и serialVersionUID.

В общем случае не рекомендуется напрямую сериализовывать / отправлять объекты класса сущностей из-за таких проблем, но также из-за проблем с отложенной инициализацией ивсе те, которые связаны с привязкой объектов к контексту менеджера сущностей.

Наиболее распространенным решением является создание «объектов переноса данных» или DTO, которые могут иметь одинаковые поля (или очень похожие - например, заменять перечисления на Strings и т. д.,зависит от того что вам нужно) и больше ничего.исходя из вашего примера, у вас может быть такой класс:

public class CompanyDTO implements Serializable {

private static final long serialVersionUID = 1L;

private int id;

private List<ClientDTO> Clients;

//GETTERS&SETTERS   

}

(по аналогии вам также необходимо создать класс ClientDTO).

Используйте этот класс вместо этого (снаружи)не обязательно является удаленным, просто там, где вам нужно отсоединиться от контекста EM).

Вы можете заполнить его вручную или любым другим способом (например, с помощью отражения, используя BeanUtils, конструктор с аргументом Company, который копирует свойства [это я бы не советовал, так как это прерывает разделение прикладного уровня, но для целей этого разговора это правильный способ сделать это]).Важно только то, что вы заполняете его из контекста менеджера сущностей

...