2014-05-15 62 views
0

我有一個休眠實體超級類:如何不inherite標識GeneratedValue休眠(在子類禁用@GeneratedValue)

@MappedSuperclass 
public abstract class Pojo_Entity_SuperClass 
{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="ID", unique=true, nullable=false, precision=18, scale=0) 
    protected long id; 
    public Long getId() {return id;} 

    //Other entity fields and methods 
} 

接下來我inherite其他實體類是這樣的:

@Entity 
@Table(name="USR") 
public class Usr extends Pojo_Entity_SuperClass 
{ 
    //Columns, fileds and others 
} 

但在某些情況下,我想用「id」字段繼承實體,而不使用@GeneratedValue註釋。 問題是 - 如何禁用@GeneratedValue註釋的id在子類中?

回答

2

您可以簡單地將@Id從基類移到子類,然後決定生成策略。

所以,你可以有:

@MappedSuperclass 
public abstract class Pojo_Entity_SuperClass 
{ 
    public abstract Long getId(); 

    public abstract void setId(Long id); 

    //Other entity fields and methods 
} 

@Entity 
@Table(name="USR") 
public class Usr extends Pojo_Entity_SuperClass { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="ID", unique=true, nullable=false, precision=18, scale=0) 
    protected long id; 
} 

@Entity 
@Table(name="ADMIN") 
public class Admin extends Pojo_Entity_SuperClass { 
    @Id 
    @SequenceGenerator(name = "ID_GENERATOR", sequenceName = "admin_id_seq") 
    @GeneratedValue(generator = "ID_GENERATOR") 
    @Column(name="ID", unique=true, nullable=false, precision=18, scale=0) 
    protected long id; 
} 

這是你需要什麼?

+0

這不是我的情況下的解決方案,因爲我在所有實體中都使用了id,有些類是繼承了三個或更多的級別。我也有很多方法在我的超類上處理id。 – user3566245

+0

也許我應該在休眠時編寫自己的ID生成器,並在我的子類中使用一些註釋來覆蓋它? – user3566245

+0

我更新了我的回覆以適應抽象getId和setId方法。這樣你可以在你的超類方法中引用這些方法。我認爲你可以嘗試將@Id從字段移到方法,它可能是重載,也會覆蓋代。但方法級別[註釋比字段級別更復雜](http://stackoverflow.com/questions/594597/hibernate-annotations-which-is-better-field-or-property-access)。 –

相關問題