Java ID为的JPA实体问题
我正在使用JPA构建一个应用程序,我希望有一个名为“BaseEntity”的父实体,具有属性ID,然后其他实体扩展这个实体,然后拥有自己的属性。父类中的字段id受保护。但是,当我启动服务器时,出现以下错误: 原因:org.hibernate.AnnotationException:未为实体com.fgonzalez.domainmodel.User指定标识符 当然,如果我将id字段放在类User中,它可以正常工作,但这不是我想要的。奇怪的是,如果我将xml文件用于hibernate映射而不是JPA,它可以正常工作,但不适用于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
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;字段,将它们从层次地狱中解放出来。它看起来更像样板,但从长远来看会容易得多,没有明显的缺点