Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用继承在jpa中实现可序列化_Java_Hibernate_Jpa_Inheritance_Serialization - Fatal编程技术网

Java 如何使用继承在jpa中实现可序列化

Java 如何使用继承在jpa中实现可序列化,java,hibernate,jpa,inheritance,serialization,Java,Hibernate,Jpa,Inheritance,Serialization,当我尝试将类映射为2个引用列时,出现以下错误: 原因:java.lang.ClassCastException:entities。无法创建客户端 转换为java.io.Serializable 我读到一些类似的问题 我看到了这个答案: 它还有一个名为referencedColumnName的参数。此参数 在目标实体中声明将用于 参加请注意,对非主键使用referencedColumnName时 列,关联的类必须是可序列化的 为什么?背景中发生了什么? @MappedSuperclass publ

当我尝试将类映射为2个引用列时,出现以下错误:

原因:java.lang.ClassCastException:entities。无法创建客户端 转换为java.io.Serializable

我读到一些类似的问题

我看到了这个答案:

它还有一个名为referencedColumnName的参数。此参数 在目标实体中声明将用于 参加请注意,对非主键使用referencedColumnName时 列,关联的类必须是可序列化的

为什么?背景中发生了什么?

@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;
    }




}