EJB3 0裡實體bean的繼承對映策略

2021-08-23 15:05:35 字數 2578 閱讀 6457

在ejb3.0 裡的實體bean繼承體系有三種繼承對映策略,分別是:

1,inheritancetype.single_table, 即整個繼承體系只對映為一張資料表,這個繼承體系的所有類的屬性都對映到將

對映到這張表的某個字段。除了所有類屬性對映的字段外,為了在這乙個張表中區分各個不同的子類資料,因此額外

增加了乙個類似於型別碼的字段用來區分不同的類,不過該字段不一定實際存在於資料表中。如果不特別指定自己的

型別碼字段,ejb3.0 會自動生成乙個虛擬的型別碼字段(名字為"dtype",型別為string),同樣型別碼的值也可以

自己為每個類指定,也可以自動生成,自動生產時值為類名。joined型別也有 dtype 這個特性

2,inheritancetype.joined, 每個類對映為一張單獨的表,但每一張表中只映**每個類特有的屬性。乙個子類物件

的資料由子類對映表裡的資料和給類父類對映表裡的資料共同組成。

為了區別各個類這個型別也有型別碼,詳細情況如上面所述。

3,inheritancetype.table_per_class, 每個類對映為一張單獨的表,且每張表中不僅包含該錶對應類的特有的屬性,

還包含了該類可能的父類的所有屬性。

下面分別給出部分示例**:

1,inheritancetype.single_table

資料表:

部分**:

// 基類

@suppresswarnings("serial")

@entity

@table(name="league")

// 宣告繼承型別

@inheritance(strategy=inheritancetype.single_table)

// 指定自定義的型別碼列

@discriminatorcolumn(name="mydtype",// 資料表中型別碼列名

discriminatortype=discriminatortype.string, // 型別

length=20) // string和char可以指定長度

// 指定該類自定義型別碼值

@discriminatorvalue(value="league")

public class league implements serializable

// 其中乙個子類

@suppresswarnings("serial")

@entity

@discriminatorvalue(value="winterleague")

public class winterleague extends league implements serializable

// 插入與查詢**示例

winterleague wl = new winterleague("wl1","1111111");

em.persist(wl);

em.flush();

listwllist = em.createquery("select w from winterleague w").getresultlist();

system.out.println("wl size="+wllist.size());

2,inheritancetype.joined

這次換成使用系統自動生成的型別碼,注意在資料表中加入 dtype欄位

注意:只有基類對映的表的主鍵為自增,子表對映的主鍵值將由基表主鍵自動填寫

資料表圖:

部分**示例:

// 基類

@suppresswarnings("serial")

@entity

@inheritance(strategy=inheritancetype.joined)

@table(name="league")

public class league implements serializable

// 乙個子類

@suppresswarnings("serial")

@entity

@table(name="winterleague")

@primarykeyjoincolumn(name="winterid")

public class winterleague extends league implements serializable

// 執行**示例

winterleague wl = new winterleague("wl1","1111111");

em.persist(wl);

em.flush();

listwllist = em.createquery("select w from winterleague w").getresultlist();

system.out.println("wl size="+wllist.size());

3,inheritancetype.table_per_class

注意:一旦使用這種策略後主鍵生成策略就不能使用 auto  和 identity 了。

資料表圖:

超快速編寫ejb3 0的實體bean

相信很多同學 特別是新手朋友 編寫實體bean的時候感到繁瑣 特別是是表的元素比較多的時候,要寫比較多的對映的屬性。雖然在eclipse中有alt s,然後按 generate getters and setters可以快速的寫這些屬性的get和set的方法,但是ejb3.0的各種各樣注釋 特別涉及...

ejb的事務與實體bean

應該使用宣告方式控制事務還是使用程式設計方式控制事務?事務與實體bean 事務型別bean container bean container 首先不要誤解事務和實體bean的關係。ejb元件有兩種劃分事務邊界的方法 程式設計型和宣告型。程式設計型事務 大多數現有的系統都是用程式設計型來劃分事務邊界。...

ejb3 0改進給我帶來的一點感受

現在我連ejb2.0都還沒弄懂,ejb就開始改進了。以前是兩個介面乙個類,現在就乙個類就可以了,而且不用jndi了。所有給我的感受是什麼是永恆不變的?從ejb而言,為什麼ejb要改進,是因為ejb2.0太麻煩了,所以為迎合大眾的需求,開發的便利,最根本的是為ejb的普及,sun不得不改進ejb。所以...