2011-03-17 40 views
1

我的映射如下。Hibernate繼承問題。使用錯誤序列的子類

這裏是所有類的基類。這個班沒有桌子。所有的子類用戶ID都是他們的PK。

@MappedSuperclass 
public abstract class Model { 
    private Long id; 

    @Id 
    @GeneratedValue(strategy=GenerationType.Sequence, generator="myGenerator") 
    public Long getId() { return id; } 
} 

在模型A類註釋,有它自己的表,以列的所有字段

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
@Table(name = "COMMENT") 
@SequenceGenerator(name="myGenerator", sequenceName="COMMENT_SEQ", allocationSize=1) 
public class Comment extends Model { 
    //some data 
} 

評論的子類,也有自己的表,用在所有領域的列評論和模型

@Entity 
@Table(name = "ORDER_COMMENT") 
@SequenceGenerator(name="myGenerator", sequenceName="ORDER_COMMENT_SEQ", allocationSize=1) 
public class OrderComment extends Model { 
    //some data 
} 

這個類有它自己的表,可以有一個到多個訂單註釋。

@Entity 
@Table(name="ORDER") 
@SequenceGenerator(name="myGenerator", sequenceName="ORDER_SEQ", allocationSize=1) 
public class Order extends Model { 
    private Set<OrderComment> = new HashSet<OrderComment>(); 

    @OneToMany 
    @JoinColumn(name="ORDER_ID") 
    public Set<OrderComment> getComments() { return comments; } 
} 

的問題是,當我添加一個新OrderComment到訂單,休眠選擇從徵詢意見,而不是爲OrderComment序列的序列編號。

任何想法,爲什麼發生這種情況,我可以改變以解決這個問題?或者有更好的方法來映射這個?

回答

1

SequenceGenerator由其名稱全局標識,因此只能有一個名爲「myGenerator」的名稱。

如果您希望在全局變量上使用您的標識符和@GeneratedValue,您需要定義一個@SequenceGenerator併爲所有表使用單個序列。

或者,你可以在你的超類中保存一個抽象的getId方法,並在每個子類上實現它:hibernate很高興,你將有一個統一的方式來達到你的id。

+0

但奇怪的是,我有一個與先前版本的hibernate(3.3.1)完全相同的序列定義,並且它工作正常。休眠3.6x不喜歡它。我在想它會覆蓋超類的順序。 – 2011-03-17 20:48:55

0

我們在這裏使用的序列發生器,以使每個型號區分,因此,一個評論型號,一個OrderComment型號,一個訂單型號,太。他們應該從這個視圖共享一個序列生成器。

您可以將多個實體使用的單個序列生成器定義爲this post