繁体   English   中英

无法使用JPA将对象持久化到数据库中,因为它没有序列化

[英]Object cannot be persisted into database with JPA because it is not serialized

我有一个使用JPA工具从数据库生成的实体。

一些列被转换为Object类型变量,如下所示。

当我尝试使用JPA将同一实体持久化到数据库中时,它给我一个错误,指出该特定变量未序列化。

如何解决此问题?

实体:

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

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "AUTHORIZATION_NUM")
    private String authorizationNum;


    @Column(name="BODY_AREA_OTHER")
    private Object bodyAreaOther;


   //more fields, getters and setters

错误如下:

Caused by: Exception [EclipseLink-7155] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The type [class java.lang.Object] for the attribute [bodyAreaOther] on the entity class [class com.ceiwc.es.test.model.TestEprecert] is not a valid type for a serialized mapping. The attribute type must implement the Serializable interface.
    at org.eclipse.persistence.exceptions.ValidationException.invalidTypeForSerializedAttribute(ValidationException.java:1139)
    at org.eclipse.persistence.internal.jpa.metadata.converters.SerializedMetadata.process(SerializedMetadata.java:99)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processSerialized(MappingAccessor.java:1948)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processMappingConverter(MappingAccessor.java:1775)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processMappingValueConverter(MappingAccessor.java:1796)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.BasicAccessor.process(BasicAccessor.java:419)
    at org.eclipse.persistence.internal.jpa.metadata.MetadataDescriptor.processMappingAccessors(MetadataDescriptor.java:1536)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.processMappingAccessors(ClassAccessor.java:1648)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.processMappingAccessors(EntityAccessor.java:1234)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.process(EntityAccessor.java:697)
    at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage2(MetadataProject.java:1793)
    at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:576)
    at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:585)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1869)
    ... 45 more

您不想在实体上实现Serializable。 还要摆脱serialVersionUID。

您正在使用哪些持久性? 您使用的是Hibernate还是Clean JPA?

看到堆栈后进行编辑:

您应该研究一下什么是JPA以及如何使用它。 http://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html

而且,如果您愿意的话,请查阅Hibernate教程,它为您提供了持久存储对象的好方法。 http://www.mkyong.com/tutorials/hibernate-tutorials/

如果您正在学习JPA,请尝试使用Oracle HR方案(Oracle 11g XE附带)。 当我学习使用JPA / Hibernate时,这是Employee对象的示例实体。

package entities;

import java.util.Date;
import java.util.List;

import javax.persistence.*;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.validator.NotNull;

@NamedQueries({
    @NamedQuery(name=Employee.QUERY_ALL_BY_MANAGER_ID, query="select e from Employee e where e.managerId=:" + Employee.PARAM_MANAGER_ID),
    @NamedQuery(name=Employee.QUERY_ALL, query="select e from Employee e order by e.department.departmentName asc")
})

@Entity
@Table(name = "EMPLOYEES")
public class Employee {
    public static final String QUERY_ALL = "employee.getAllEmployees";
    public static final String QUERY_ALL_BY_MANAGER_ID = "employee.getEmployeesUnderSpecificManager";
    public static final String PARAM_MANAGER_ID = "managerId";

    @OneToMany(targetEntity = Department.class, mappedBy = "managerId", cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Department> departments;

    @Id
    @Column(name = "EMPLOYEE_ID")
    private Integer employeeId;

    @Column(name = "FIRST_NAME")
    private String firstName;

    @NotNull
    @Column(name = "LAST_NAME")
    private String lastName;

    @NotNull
    @Column(name = "EMAIL")
    private String email;

    @Column(name = "PHONE_NUMBER")
    private String phoneNumber;

    @NotNull
    @Column(name = "HIRE_DATE")
    private Date hireDate;

    @NotNull
    @ManyToOne(targetEntity = Job.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "JOB_ID")
    private Job job;

    @Column(name = "SALARY")
    private Integer salary;

    @Column(name = "COMMISSION_PCT")
    private Integer commissionPct;

    @Column(name = "MANAGER_ID")
    private Integer managerId;

    @ManyToOne(targetEntity = Department.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "DEPARTMENT_ID")
    private Department department;

    @OneToMany(targetEntity = Employee.class, mappedBy = "managerId", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Employee> team;

    public Employee() {
    }

    public List<Employee> getTeam() {
        return team;
    }

    public List<Department> getDepartments() {
        return departments;
    }

    public void setDepartments(List<Department> departments) {
        this.departments = departments;
    }

    public Integer getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(Integer employeeId) {
        this.employeeId = employeeId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    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 Date getHireDate() {
        return hireDate;
    }

    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    }

    public Job getJob() {
        return job;
    }

    public void setJob(Job job) {
        this.job = job;
    }

    public Integer getSalary() {
        return salary;
    }

    public void setSalary(Integer salary) {
        this.salary = salary;
    }

    public Integer getCommissionPct() {
        return commissionPct;
    }

    public void setCommissionPct(Integer commissionPct) {
        this.commissionPct = commissionPct;
    }

    public Integer getManagerId() {
        return managerId;
    }

    public void setManagerId(Integer managerId) {
        this.managerId = managerId;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    @Override
    public String toString() {
        return getFirstName() + " " + getLastName();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM