Как использовать или аннотировать фиктивное поле в компоненте сущности JPA, которое не должно сохраняться в базе данных - PullRequest
21 голосов
/ 07 ноября 2010

У меня есть этот код для проверки входа в систему с использованием класса действий Struts2, который вызывает EJB для проверки LDAP, а затем, если (учетные данные LDAP) проверяются, запрашивая базу данных пользователей для получения остальной пользовательской информации, используя объектный компонент JPA, который также действует как POJO. В отличие от имени пользователя, идентификатора пользователя и другой пользовательской информации, пароль не хранится в базе данных, но ради метода получения и установки POJO я пытаюсь включить фиктивное поле пароля - для обслуживания формы действия 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)
....

Вот код из бина сущности:

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

Есть ли обходной путь для этого?

1 Ответ

62 голосов
/ 07 ноября 2010

Аннотируйте любые поля, которые вы не хотите сохранять, как @Transient.Он находится в упаковке javax.persistence.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...