假設一個物件Object有若干個參數(shù),而參數(shù)的名稱和數(shù)量是不確定的,想知道這種情況下資料表應該怎麼設計才會更適合Hibernate去操作.
之前我弄過一個方案(想聽大神吐槽):
一共用到了兩個表:一個是tab表,一個是tabmeta表,並將tabmeta表中的tid參照tab的id創(chuàng)建外鍵(其實不想在數(shù)據(jù)庫中創(chuàng)建出這個關(guān)係,想在程式或DAO層實現(xiàn)這樣的關(guān)係).
建立出對應的實體類別(用InteliJ IDEA的逆向工程直接透過表格產(chǎn)生的):
//tab的實體類
@Entity
@Table(name = "tab", schema = "springfkhibernate", catalog = "")
public class TabEntity {
private int id;
private String name;
private Map<Object, TabmetaEntity> tabmetasById;
//省略一些該有的函數(shù)和geter seter
@MapKey(name = "metakey")
@OneToMany(mappedBy = "tabByTid")
public Map<Object, TabmetaEntity> getTabmetasById() {
return tabmetasById;
}
public void setTabmetasById(Map<Object, TabmetaEntity> tabmetasById) {
this.tabmetasById = tabmetasById;
}
}
//tabmeta的實體類
@Entity
@Table(name = "tabmeta", schema = "springfkhibernate", catalog = "")
public class TabmetaEntity {
private int id;
private String metakey;
private String metavalue;
//省略該有的getter和setter
}
產(chǎn)生的時候的參數(shù):
但是這樣會搞出兩個實體類別出來,一個是TabEntity,一個是TabValueEntity,強迫癥表示不爽啊,本來這兩個表描述的是一個實體的問題,而不是兩個具有一對多的兩個對象的關(guān)係.現(xiàn)在我想問一下能不能實現(xiàn)在TabEntity中準備一個類型為(Hash)Map的變量metas,專門用來存儲這些不確定的參數(shù),這樣就只有一個實體類了.但是這樣的話,數(shù)據(jù)在回存數(shù)據(jù)庫的時候又應該怎麼實現(xiàn)呢?
現(xiàn)在這種方式產(chǎn)生的實體類如果想要訪問其中的某一個不定參數(shù)的話,需要:TabDao.getEntity(...).getTabmetasById().get('somekey').getMetaValue()
#來實作,但是如果把這兩個表的資料理解成一個實體的資料的話就應該這麼實作:TabDao.getEntity(...).getMeta('somekey')
不知道大神有沒有針對這方面的建議....
另外想問大神在IDEA的關(guān)係創(chuàng)建的對話框中每一項參數(shù)會產(chǎn)生怎樣的影響.
困惑比較大,還望大神們賜教!
又到了自問自答的環(huán)節(jié)....
如果說實現(xiàn)我上面說的那種方式,還要實現(xiàn)LazyLoad,IDEA自動生成基本上是沒戲的....那個生成的功能是不包括建立非物件之間的關(guān)係的,如果需要建立,只能自己去改映射檔.先把那個tab表的實體類別生成出來,然後在tab的實體類別中加入一個Map類型的物件(具體映射的類型看另一個表格的欄位資料型別),產(chǎn)生對應的geter和seter函數(shù).
然後就是map檔:
<map name="values" table="tabmeta">
<key column="tid" foreign-key="id"/><!--虛擬外鍵:誰和誰相等代表關(guān)系-->
<index column="meta_key" type="string"/><!--Map的Key是誰-->
<element column="meta_value" type="double"/><!--Map的Value是誰-->
</map>