JPA - использование аннотаций в модели - PullRequest
3 голосов
/ 08 октября 2010

Мое приложение работает на JPA / Hibernate, Spring и Wicket. Я пытаюсь преобразовать нашу ORM из файлов XML в аннотации JPA. Аннотированная модель выглядит так:

@Entity
@Table(name = "APP_USER")
public class User extends BaseObject {
    private Long id;
    private String firstName;
    private String lastName;
    private String email;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "ID")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name="FIRST_NAME")
    public String getFirstName() {
        return firstName;
    }

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

    @Column(name="LAST_NAME")
    public String getLastName() {
        return lastName;
    }

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

    @Column(name="EMAIL")
    public String getEmail() {
        return email;
    }

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

    /**
     * @return Returns firstName and lastName
     */
    public String getFullName() {
        return firstName + ' ' + lastName;
    }
}

Первоначально, однако, это было без аннотации, и отображение было описано в User.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="org.appfuse.model.User" table="app_user">
        <id name="id" column="id" unsaved-value="null">
            <generator class="increment"/>
        </id>
        <property name="firstName" column="first_name" not-null="true"/>
        <property name="lastName" column="last_name" not-null="true"/>
        <property name="email" column="email"/>
    </class>
</hibernate-mapping>

Когда я удаляю файл сопоставления и пытаюсь использовать только аннотации, entityManagerFactory не создается, за исключением

org.hibernate.PropertyNotFoundException: Could not find a setter for property fullName in class org.appfuse.model.User.

Для этого свойства не задано сопоставление, потому что это просто вспомогательный метод. Что я делаю не так?

1 Ответ

7 голосов
/ 08 октября 2010

Отметьте метод как @Transient, чтобы Hibernate игнорировал его:

/**
 * @return Returns firstName and lastName
 */
@Transient
public String getFullName() {
    return firstName + ' ' + lastName;
}

По умолчанию все, что похоже на геттер, отображается.

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