我正在使用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;
}
}
提前谢谢!!
答案 0 :(得分:2)
你不能这样做:BaseEntity不是@Entity,所以@Id甚至不应该被处理。
如果Hibernate在使用xml时会对其进行处理,那么这可能是一种不可移植的特性。
你可以实现一些实体层次结构,但在这种情况下我不会这样做。你只能扩展一次,这看起来不像真正的层次结构:只有一个根,每个类共享一个?
您可以在此处找到有关实体继承的更多信息:http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html
您可以使用合成而不是继承。在这种情况下,只需使用@Embeddable注释您的User类(它不是@Entity),并在using类上使用@EmbeddedId注释一个字段。
尽管如此,我不会这样做:它看起来更干涩,但它没有更多的好处,用其他东西替换所有其他东西只是为了不重复你自己(无论如何你会做)。
我只有一个@Id Long id;每个实体中的字段,将它们从等级地狱中解放出来。它看起来更像样板,但从长远来看会更容易,没有明显的劣势。
答案 1 :(得分:0)
如果你在JPA中进行工具继承,你不应该在java中这样做。 JPA有自己的实施策略。看看here并选择最适合您需求的那个