Java JPA-在模型中使用注释

Java JPA-在模型中使用注释,java,hibernate,jpa,annotations,Java,Hibernate,Jpa,Annotations,我的应用程序运行在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 e

我的应用程序运行在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:
找不到属性的setter
全名
org.appfuse.model.User.

这个属性没有映射集,因为它只是一个方便的方法。我做错了什么?

标记该方法,以便Hibernate忽略它:

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

默认情况下,所有看起来像getter的东西都会被映射。

如果方法本身是transient(公共transient字符串getFullName)@Jamie:transient关键字只对成员变量有效,对方法无效,所以这不是一个选项。啊,对,我的错误。如果一个字段是临时的,并且有公共的getter和setter,那么仍然需要用@transient注释来标记它吗?当然,JPA只查看@transient注释,而不查看transient关键字。将变量标记为瞬态不会影响JPA@Jamie这也行得通@Salandur:不,将成员变量标记为
transient
也可以防止它被持久化。Hibernate文档说:“一个实体的每个非静态非瞬态属性(字段或方法,取决于访问类型)都被认为是持久的,除非您将其注释为
@transient
。”