Java 如何使用继承在jpa中实现可序列化
当我尝试将类映射为2个引用列时,出现以下错误: 原因:java.lang.ClassCastException:entities。无法创建客户端 转换为java.io.Serializable 我读到一些类似的问题 我看到了这个答案: 它还有一个名为referencedColumnName的参数。此参数 在目标实体中声明将用于 参加请注意,对非主键使用referencedColumnName时 列,关联的类必须是可序列化的 为什么?背景中发生了什么?Java 如何使用继承在jpa中实现可序列化,java,hibernate,jpa,inheritance,serialization,Java,Hibernate,Jpa,Inheritance,Serialization,当我尝试将类映射为2个引用列时,出现以下错误: 原因:java.lang.ClassCastException:entities。无法创建客户端 转换为java.io.Serializable 我读到一些类似的问题 我看到了这个答案: 它还有一个名为referencedColumnName的参数。此参数 在目标实体中声明将用于 参加请注意,对非主键使用referencedColumnName时 列,关联的类必须是可序列化的 为什么?背景中发生了什么? @MappedSuperclass publ
@MappedSuperclass
public abstract class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "full_name")
private String fullName;
private String email;
@Column(name = "phone_number")
private String phoneNumber;
private String address;
public Person()
{
}
public Person(String fullName, String phoneNumber, String email, String address )
{
this.fullName = fullName;
this.email = email;
this.phoneNumber = phoneNumber;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
当我执行代码时:
Client client = new Client("Benny Hagadol", "0523612324","Bennyhagadol@gmail.com","Florentin 34 Tel Aviv");
Reservation re = new Reservation();
client.addReservation(re);
new ClientManager().addClient(client);
public void addClient(Client client) {
this.em.getTransaction().begin();
this.em.persist(client);
this.em.getTransaction().commit();
}
例外情况:
14, 2019 10:10:32 PM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate:
insert
into
CLIENTS
(address, email, full_name, phone_number)
values
(?, ?, ?, ?)
Hibernate:
insert
into
RESERVATIONS
(client_id, client_full_name, created_on, date_to_supply, last_updated, total_sum)
values
(?, ?, ?, ?, ?, ?)
Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction
at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:81)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104)
at managers.ClientManager.addClient(ClientManager.java:31)
at GUI.Menu.main(Menu.java:148)
Caused by: java.lang.ClassCastException: entities.Client cannot be cast to java.io.Serializable
at org.hibernate.type.CollectionType.getKeyOfOwner(CollectionType.java:446)
at org.hibernate.engine.internal.Collections.processReachableCollection(Collections.java:166)
at org.hibernate.event.internal.FlushVisitor.processCollection(FlushVisitor.java:50)
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:104)
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:65)
at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:59)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:182)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:233)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:93)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1358)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:436)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3235)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2403)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
... 2 more
在我知道我必须实现Serializable之后(不仅仅是为了良好的实践)
我该怎么做
2。子类必须实现可序列化吗?还是只有超类?
@MappedSuperclass
public abstract class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "full_name")
private String fullName;
private String email;
@Column(name = "phone_number")
private String phoneNumber;
private String address;
public Person()
{
}
public Person(String fullName, String phoneNumber, String email, String address )
{
this.fullName = fullName;
this.email = email;
this.phoneNumber = phoneNumber;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
3。我必须声明serialVersionUID吗?
@MappedSuperclass
public abstract class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "full_name")
private String fullName;
private String email;
@Column(name = "phone_number")
private String phoneNumber;
private String address;
public Person()
{
}
public Person(String fullName, String phoneNumber, String email, String address )
{
this.fullName = fullName;
this.email = email;
this.phoneNumber = phoneNumber;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
4。如果子类必须实现Serializable,那么当询问异常时,它们必须声明serialVersionUID?,发布导致异常的代码,以及异常的完整而准确的堆栈跟踪。实体不需要实现可序列化。问题是由代码中的错误引起的,但您尚未发布该错误,因此我们无法提供帮助。我编辑了该问题,谢谢。发布两个实体和超类的完整(从第0行到最后一行)代码。而且你真的不应该在预订中保存客户的全名。它已经在客户端中,并且预订与客户端有关联。所以这是多余的。这样做还可以防止您更改客户的全名。相信我:这是会发生的。我编辑过,但是如果我想使用像getAllReservations这样的方法,不仅仅是为一个客户,我希望他的名字在保留旁边,我不想得到客户的所有详细信息,我如何只得到全名?通过使用带有连接的查询。如果明天,您的客户要求显示客户全名,以及他的电子邮件、地址和电话号码,您不会将客户的所有列复制到预订中,对吗?在询问异常时,发布导致异常的代码,以及异常的完整准确堆栈跟踪。实体不需要实现可序列化。问题是由代码中的错误引起的,但您尚未发布该错误,因此我们无法提供帮助。我编辑了该问题,谢谢。发布两个实体和超类的完整(从第0行到最后一行)代码。而且你真的不应该在预订中保存客户的全名。它已经在客户端中,并且预订与客户端有关联。所以这是多余的。这样做还可以防止您更改客户的全名。相信我:这是会发生的。我编辑过,但是如果我想使用像getAllReservations这样的方法,不仅仅是为一个客户,我希望他的名字在保留旁边,我不想得到客户的所有详细信息,我如何只得到全名?通过使用带有连接的查询。如果明天,您的客户要求显示客户全名,以及他的电子邮件、地址和电话号码,您不会将客户的所有列复制到预订中,对吗?
@MappedSuperclass
public abstract class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "full_name")
private String fullName;
private String email;
@Column(name = "phone_number")
private String phoneNumber;
private String address;
public Person()
{
}
public Person(String fullName, String phoneNumber, String email, String address )
{
this.fullName = fullName;
this.email = email;
this.phoneNumber = phoneNumber;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}