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

4 浏览
0 Comments

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

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

问题是,在LDAP认证后,出现一个异常,指出数据库中不存在“password”列(本来也没有意义!)

异常[EclipseLink-4002](Eclipse Persistence Services - 2.0.1.v20100213-r6600):org.eclipse.persistence.exceptions.DatabaseException
内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:在“字段列表”中未知列'PASSWORD'
错误代码:1054
Call: SELECT PERSON_ID, ACTIVE_USER, EMAIL, FIRSTNAME, SURNAME, PASSWORD, FULLNAME, EMPLOYEE_NUMBER FROM xxte_employees WHERE (ACTIVE_USER = ?)
        绑定 => [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)
....

以下是实体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

有什么解决办法吗?

0