如何在JPA实体bean中使用或注释虚拟字段,该虚拟字段不应该在数据库中持久化

Sky*_*han 26 java orm jpa

我有使用Struts2动作类进行登录验证的代码,该动作类调用EJB进行LDAP验证,然后验证(LDAP凭证),查询用户数据库以使用JPA实体bean获取其余的用户信息. POJO.与用户名,用户ID和其他用户信息不同,密码不存储在数据库中,但是为了POJO getter和setter方法,我尝试包含一个虚拟密码字段 - 用于提供Struts2操作表单.

问题是在ldap身份验证之后,发生了一个异常,说明数据库中不存在"密码"列(无论如何都不是这样!)

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'PASSWORD' in 'field list'
Error Code: 1054
Call: SELECT PERSON_ID, ACTIVE_USER, EMAIL, FIRSTNAME, SURNAME, PASSWORD, FULLNAME, EMPLOYEE_NUMBER FROM xxte_employees WHERE (ACTIVE_USER = ?)
        bind => [john.doe]
Query: ReadAllQuery(name="XxteEmployees.validateLogin" referenceClass=XxteEmployees sql="SELECT PERSON_ID, ACTIVE_USER, EMAIL, FIRSTNAME, SURNAME, PASSWORD, FULLNAME, EMPLOYEE_NUMBER FROM xxte_employees WHERE (ACTIVE_USER = ?)")
        at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)
        at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:687)
        at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:530)
        at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:529)
....
Run Code Online (Sandbox Code Playgroud)

这是实体bean的代码:

public class XxteEmployees implements Serializable {
    private static final long serialVersionUID = 1L;
    @Column(name = "ACTIVE_USER")
    private String activeUser;
    @Column(name = "EMAIL")
    private String email;
    @Id
    @Basic(optional = false)
    @Column(name = "PERSON_ID")
    private Double personId;
    @Column(name = "EMPLOYEE_NUMBER")
    private Double employeeNumber;
    @Column(name = "FIRSTNAME")
    private String firstname;
    @Column(name = "SURNAME")
    private String surname;

    private String fullname;

    private String password;

    public XxteEmployees() {
    }

    public XxteEmployees(Double personId) {
        this.personId = personId;
    }

    public String getActiveUser() {
        return activeUser;
    }

    public void setActiveUser(String activeUser) {
        this.activeUser = activeUser;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Double getPersonId() {
        return personId;
    }

    public void setPersonId(Double personId) {
        this.personId = personId;
    }

    public Double getEmployeeNumber() {
        return employeeNumber;
    }

    public void setEmployeeNumber(Double employeeNumber) {
        this.employeeNumber = employeeNumber;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }


    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    // BEGIN: objects not in db

    public String getFullname() {
        return firstname + ' ' + surname;
    }


    public void setFullname(String fullname) {
        this.fullname = firstname + ' ' + surname;;
    }

    public String getPassword() {
        return sifre;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    // END: objects not in db
Run Code Online (Sandbox Code Playgroud)

有什么解决方法吗?

Ste*_*tez 68

注释您不希望保留的任何字段@Transient.它在javax.persistence包中.