带有ID的JPA实体问题

时间:2014-12-06 15:04:12

标签: java hibernate jpa

我正在使用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;
}

}

提前谢谢!!

2 个答案:

答案 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并选择最适合您需求的那个