我正在使用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;
}
}
先感谢您!!
您不能以这种方式这样做:BaseEntity不是@Entity,因此甚至不应处理@Id。
如果Hibernate在使用xml时确实处理了它,那可能是不可移植的特性。
您可以实现某些实体层次结构,但是在这种情况下我不会这样做。您只能扩展一次,这看起来并不像真正的层次结构:每个类都只有一个根?
您可以在此处找到有关实体继承的更多信息:http : //docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html
您可以使用合成代替继承。在这种情况下,只需使用@Embeddable注释User类(不是@Entity),并在using类上使用@EmbeddedId注释字段。
仍然,我不会这样做:看起来更干了,但是它没有更多的好处,就是用别的东西替换String到处都只是为了不重复自己(无论如何你都会这样做)。
我只有一个@Id Long id;每个实体中的字段,将它们从层次结构地狱中释放出来。它看起来更像样板,但从长远来看会更容易,没有明显的缺点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句