2014-12-06 121 views
0

我正在使用JPA構建一個應用程序,我想要一個名爲「BaseEntity」的父實體具有屬性ID,然後是其他實體擴展此實體,然後擁有自己的屬性。父類中的字段ID受到保護。然而,當我開始,我發現了以下錯誤的服務器:JPA實體問題ID

造成的:org.hibernate.AnnotationException:沒有爲實體指定的標識符:com.fgonzalez.domainmodel.User

當然,如果我的地方id類字段中的用戶,它工作正常,但這不是我想要的。奇怪的是,如果我使用xml文件來代替JPA的hibernate映射,它可以正常工作,但不能用於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

你不能這樣做:BaseEntity不是@Entity,所以@Id甚至不應該被處理。

如果Hibernate在使用xml時處理它,那可能是一種非便攜式特性。

你可以實現一些實體層次結構,但在這種情況下我不會這樣做。你只能延伸一次,這看起來不像一個真正的層次結構:只有一個根,每個類共享一個根?

您在這裏可以找到實體繼承的更多信息:http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

你可以使用,而不是繼承組成。在這種情況下,只需使用@Embeddable註釋您的User類(不會是@Entity),並在using類中使用@EmbeddedId註釋字段。

不過,我不會這樣做:它似乎更幹,但它沒有更多的好處,用其他東西替換字符串只是爲了不重複自己(然後你會做什麼)。

我只想要一個@Id Long id;在每個實體領域,釋放他們從等級地獄。它看起來更多樣板,但從長遠來看會更容易,沒有明顯的缺點。

0

如果你要在JPA中實現繼承,你不會像在java中那樣做。 JPA有自己的實施策略。看看here並選擇最適合您的需求