【问题标题】:JPA - using annotations in a modelJPA - 在模型中使用注释
【发布时间】:2011-04-22 22:09:41
【问题描述】:

我的应用程序在 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>

当我删除映射文件并尝试仅使用注释时,实体管理器工厂不会被创建,除了

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

没有为此属性设置映射,因为它只是一种方便的方法。我做错了什么?

【问题讨论】:

    标签: java hibernate jpa annotations


    【解决方案1】:

    将该方法标记为@Transient,这样Hibernate 将忽略它:

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

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

    【讨论】:

    • 如果方法本身是瞬态的(公共瞬态字符串getFullName)是否也会忽略它
    • @Jamie:transient 关键字仅适用于成员变量,不适用于方法,所以这不是一个选项。
    • 啊,对,我的错。如果一个字段是瞬态的,并且有公共的 getter 和 setter,是否仍然需要使用 @Transient 注释对其进行标记?
    • 当然,JPA 只看@Transient 注解,而不看transient 关键字。将变量标记为瞬态对 JPA 没有影响
    • @Jamie 这也有效。 @Salandur:不,将成员变量标记为transient 也可以防止它被持久化。 hiberante 文档说:“实体的每个非静态非瞬态属性(字段或方法取决于访问类型)都被认为是持久的,除非您将其注释为 @Transient。” docs.jboss.org/hibernate/stable/annotations/reference/en/html/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多