【问题标题】:JPA Entity issue with ID带有 ID 的 JPA 实体问题
【发布时间】:2014-12-06 15:04:12
【问题描述】:

我正在使用 JPA 构建一个应用程序,我希望有一个名为“BaseEntity”的父实体,它具有属性 ID,然后其他实体扩展该实体,然后拥有自己的属性。父类中的字段 id 是受保护的。但是,当我启动服务器时,出现以下错误:

原因:org.hibernate.AnnotationException:没有为实体指定标识符:com.fgonzalez.domainmodel.User

当然,如果我将 id 字段放在 User 类中,它可以正常工作,但这不是我想要的。奇怪的是,如果我将 xml 文件用于休眠映射而不是 JPA,它可以正常工作,但不能使用 JPA。知道问题出在哪里吗?附上代码:

基础实体:

public class BaseEntity implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;


@Id
@GeneratedValue
@Column(name="id")
protected Long id;

public Long getId() {
    return id;
}

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


}

和用户实体:

@Entity
@Table(name="users")
public class User extends BaseEntity{


/**
 * 
 */
private static final long serialVersionUID = 1L;

/**
 * 
 */

@Column(name="EMAIL",nullable=false,length=50,insertable=true,updatable=true)
private String email;

@Column(name="PASSWORD",nullable=false,length=50,insertable=true,updatable=true)
private String password;



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


public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}

}

提前谢谢你!!

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    你不能这样做:BaseEntity 不是@Entity,所以@Id 甚至不应该被处理。

    如果 Hibernate 确实在使用 xml 时处理它,那可能是一种不可移植的特性。

    您可以实现一些实体层次结构,但在这种情况下我不会这样做。你只能扩展一次,这看起来不像一个真正的层次结构:只有一个根,由每个类共享?

    您可以在此处找到有关实体继承的更多信息:http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

    您可以使用组合而不是继承。在这种情况下,只需使用@Embeddable 注释您的用户类(不会是@Entity),并在使用类上使用@EmbeddedId 注释一个字段。

    不过,我不会那样做:它看起来更干,但它没有更多的好处,用其他东西替换 String 只是为了不重复你自己(你无论如何都会这样做)。

    我只会有一个@Id Long id;每个实体中的字段,将它们从等级地狱中解放出来。它看起来更像样板,但从长远来看会更容易,没有明显的缺点。

    【讨论】:

      【解决方案2】:

      如果你打算在 JPA 中实现继承,你不应该像在 java 中那样做。 JPA 有自己的实施策略。看看here 并选择最适合您需要的那个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 2011-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        相关资源
        最近更新 更多