2017-08-02 32 views
3

問題

在我目前的項目中,我得到這個AnnotationExceptionHibernate並不在吸氣拿起@Id註釋

org.hibernate.AnnotationException:沒有爲實體指定的標識符:my.package.EntityClass

有缺陷的代碼

的問題是由@Id註釋,這是我從移動引起的現場吸氣劑:

@Entity 
@Table(name = "MY_TABLE") 
public class EntityClass extends BaseEntityClass { 

    private long id; 

    @Override 
    public void setId(long id) { 
    this.id = id; 
    } 

    @Override 
    @Id 
    @SequenceGenerator(name = "FOOBAR_GENERATOR", sequenceName = "SEQ_MY_TABLE", allocationSize = 1, initialValue = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "FOOBAR_GENERATOR") 
    public long getId() { 
    return this.id; 
    } 

} 

工作守則

當我註釋id屬性相反,它工作正常:

@Entity 
@Table(name = "MY_TABLE") 
public class EntityClass extends BaseEntityClass { 

    @Id 
    @SequenceGenerator(name = "FOOBAR_GENERATOR", sequenceName = "SEQ_MY_TABLE", allocationSize = 1, initialValue = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "FOOBAR_GENERATOR") 
    private long id; 

    @Override 
    public void setId(long id) { 
    this.id = id; 
    } 

    @Override 
    public long getId() { 
    return this.id; 
    } 

} 

參考文檔

Hibernate documentation狀態:

默認情況下,類層次結構的訪問類型由@Id或@EmbeddedId註釋的位置定義。如果這些註釋位於一個字段上,那麼只有字段被認爲是持久性的,並且狀態通過該字段被訪問。如果註釋位於getter上,那麼只有getter被認爲是持久性的,並且通過getter/setter來訪問狀態。這在實踐中效果很好,並且是推薦的方法。

問題

我班有額外的屬性,其中我想註釋干將。所以我需要將@Id註釋也放在getter上。

此前在其他項目中工作正常,但此時Hibernate似乎沒有拿起實體的標識符,當getter註釋。

  • 是否有任何額外的配置屬性,我必須改變?

  • 或者在Hibernate版本之間做了這種行爲改變?

+0

是該實體上唯一的字段?如果有其他人,他們是否也有獲得者的註釋? –

+0

正如我的問題所提到的,有更多的領域,並最終,我想在獲得者的所有註釋。但是這並不起作用,除非Hibernate在getter處拾取「@ Id」標註。 – user1438038

+0

請問您可以發佈'BaseEntityClass'類的實現嗎? –

回答

0

你需要在所有的獲得者上一致地使用@Id。確保沒有字段用@Id而不是獲得者註釋。混合和匹配會停止正常工作。