Java ID为的JPA实体问题

Java ID为的JPA实体问题,java,hibernate,jpa,Java,Hibernate,Jpa,我正在使用JPA构建一个应用程序,我希望有一个名为“BaseEntity”的父实体,具有属性ID,然后其他实体扩展这个实体,然后拥有自己的属性。父类中的字段id受保护。但是,当我启动服务器时,出现以下错误: 原因:org.hibernate.AnnotationException:未为实体com.fgonzalez.domainmodel.User指定标识符 当然,如果我将id字段放在类User中,它可以正常工作,但这不是我想要的。奇怪的是,如果我将xml文件用于hibernate映射而不是JP

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

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

当然,如果我将id字段放在类User中,它可以正常工作,但这不是我想要的。奇怪的是,如果我将xml文件用于hibernate映射而不是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;
}

}

提前谢谢你

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

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

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

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

您可以在此处找到有关实体继承的更多信息:

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

尽管如此,我还是不会这么做:它看起来更干燥,但它没有更多的好处,用其他东西代替字符串,只是为了不重复你自己(你无论如何都会这样做)

我只需要一个@Id长Id;字段,将它们从层次地狱中解放出来。它看起来更像样板,但从长远来看会容易得多,没有明显的缺点