2012-01-11 69 views
0

我有一個分層的JPA映射,它是幾個Classes深層的。像這樣的東西JPA深度繼承註釋屬性

@Entity 
@Inheritance(strategy= InheritanceType.SINGLE_TABLE) 
public abstract class BaseEntityClass implements Serializable { 

    // lots of stuff common to all my entities. 

} 

@Entity 
@Inheritance(strategy= InheritanceType.TABLE_PER_CLASS) 
public abstract class EntityTypeOne extends BaseEntityClass { 
    // stuff common to EntityTypeOne 
} 

@Entity 
@Inheritance(strategy= InheritanceType.TABLE_PER_CLASS) 
public abstract class EntityTypeTwo extends BaseEntityClass { 
    // stuff common to EntityTypeTwo 
} 

我知道你使用超類的@Inheritence方法來定義映射策略。但是,這對深層次結構是如何工作的?我希望所有的葉類都映射到自己的表中。我應該用BaseEntityClass來做SINGLE_TABLE嗎?

回答

2

您的基類應該標記爲TABLE_PER_CLASS。下面是OpenJPA一個例子:

定義用於一個實體類 的繼承策略:

@Entity 
@Table(name="MAG") 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class Magazine { 
    ... 
} 

@Entity 
@Table(name="TABLOID") 
public class Tabloid 
    extends Magazine { 
    ... 
} 

按照JPA JavaDocs,該@Inheritance註釋應該在類層次結構的根目錄來指定層次結構。它是作爲實體類層次結構的根的實體類指定的。

如果這個註釋可以放在子類上,並且它的行爲是未定義的,它不是由規範指定的。

所以回答你提出的意見的問題,如果你有這樣的層次:

SubSub -> Sub -> Base 

你只需要批註Base@Inheritance(strategy = TABLE_PER_CLASS)

+0

那麼,這樣的情況下,層次結構中的所有超類都必須具有相同的@Inheritence註釋?如果不是這意味着有什麼不同的註釋? – b3bop 2012-01-11 20:17:16

+0

請參閱最新的答案。 – Behrang 2012-01-11 21:21:32

+0

真棒。謝謝 – b3bop 2012-01-11 22:25:12