Java JPA,什么时候实体必须实现可序列化

Java JPA,什么时候实体必须实现可序列化,java,jpa,eclipselink,inner-classes,Java,Jpa,Eclipselink,Inner Classes,我目前正在学习JPA。在文档中,它指出只有当实体被其他JVM远程分离时,它才需要是可序列化的 然而,出于测试目的,我将实体创建为持久性类(CDI)的内部私有类。 当我尝试使用EntityManager持久化实体时。我得到一个例外,如下所示: Caused by: Exception [EclipseLink-7155] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.excepti

我目前正在学习JPA。在文档中,它指出只有当实体被其他JVM远程分离时,它才需要是可序列化的

然而,出于测试目的,我将实体创建为持久性类(CDI)的内部私有类。 当我尝试使用EntityManager持久化实体时。我得到一个例外,如下所示:

Caused by: Exception [EclipseLink-7155] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The type [class minh.ea.common.Ultilities.DatabaseLogger] for the attribute [this$0] on the entity class [class minh.ea.common.Ultilities.DatabaseLogger$LogRecord] is not a valid type for a serialized mapping. The attribute type must implement the Serializable interface.
package minh.ea.common.Ultilities;

import java.util.Date;
import javax.enterprise.context.ApplicationScoped;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PersistenceContext;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.transaction.Transactional;

/**
 *
 * @author Minh
 */

@ApplicationScoped
@minh.ea.common.Ultilities.qualifiers.Database
public class DatabaseLogger implements Logger {

    @PersistenceContext
    private EntityManager em;

    private final long MAX_SIZE=2097152;

    public DatabaseLogger(){

    }

    @Override
    @Transactional
    public void info(Object obj) {
        em.persist(new RecordEntry("INFO", new Date(), obj.toString()));
    }

    @Override
    @Transactional
    public void warn(Object obj) {
        em.persist(new RecordEntry("WARN", new Date(), obj.toString()));
    }

    @Override
    @Transactional
    public void error(Object obj) {
        em.persist(new RecordEntry("ERROR", new Date(), obj.toString()));
    }

    @Override
    @Transactional
    public void fatal(Object obj) {
        em.persist(new RecordEntry("FATAL", new Date(), obj.toString()));
    }

    @Entity
    public class LogRecord{

        @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String type;
        @Temporal(TemporalType.TIMESTAMP)
        private Date time;
        private String message;

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public Date getTime() {
            return time;
        }

        public void setTime(Date time) {
            this.time = time;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public LogRecord() {
        }

        public LogRecord(String type, Date time, String message) {
            this.type = type;
            this.time = time;
            this.message = message;
        }
    }

}
正如我所理解的,这个异常意味着我的实体属性和类一样需要是可序列化的。那么,原因是什么,它被传递到了哪里

所有这些都在GlassFish 4.0容器下运行。使用EclipseLink 2.1的JPA

我对持久性和内部实体的实现如下:

Caused by: Exception [EclipseLink-7155] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The type [class minh.ea.common.Ultilities.DatabaseLogger] for the attribute [this$0] on the entity class [class minh.ea.common.Ultilities.DatabaseLogger$LogRecord] is not a valid type for a serialized mapping. The attribute type must implement the Serializable interface.
package minh.ea.common.Ultilities;

import java.util.Date;
import javax.enterprise.context.ApplicationScoped;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PersistenceContext;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.transaction.Transactional;

/**
 *
 * @author Minh
 */

@ApplicationScoped
@minh.ea.common.Ultilities.qualifiers.Database
public class DatabaseLogger implements Logger {

    @PersistenceContext
    private EntityManager em;

    private final long MAX_SIZE=2097152;

    public DatabaseLogger(){

    }

    @Override
    @Transactional
    public void info(Object obj) {
        em.persist(new RecordEntry("INFO", new Date(), obj.toString()));
    }

    @Override
    @Transactional
    public void warn(Object obj) {
        em.persist(new RecordEntry("WARN", new Date(), obj.toString()));
    }

    @Override
    @Transactional
    public void error(Object obj) {
        em.persist(new RecordEntry("ERROR", new Date(), obj.toString()));
    }

    @Override
    @Transactional
    public void fatal(Object obj) {
        em.persist(new RecordEntry("FATAL", new Date(), obj.toString()));
    }

    @Entity
    public class LogRecord{

        @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String type;
        @Temporal(TemporalType.TIMESTAMP)
        private Date time;
        private String message;

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public Date getTime() {
            return time;
        }

        public void setTime(Date time) {
            this.time = time;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public LogRecord() {
        }

        public LogRecord(String type, Date time, String message) {
            this.type = type;
            this.time = time;
            this.message = message;
        }
    }

}
请注意,

根据,有效的
实体
类必须是顶级类,这意味着您的内部类将无法工作


试着把它拉到自己的
实体
类中,因为它会在一个合适的系统中,然后再次保存。

谢谢,这是真的,但是你能帮我理解为什么它会输出一个关于序列化的错误吗?你的
RecordEntry
类的映射是什么样子的?它提到了序列化,因为你的实体是一个内部类,所以自动有一个$0的属性指向JPA被迫映射的外部类。由于该属性不是实体或基本类型,因此它默认使用可序列化映射,因此出现异常。如果它是可序列化的,它将尝试将外部实例序列化为表中的lob字段。感谢Chris的精彩解释。