java - Hibernate如何處理參數(shù)數(shù)量不定的實(shí)體類
問(wèn)題描述
假設(shè)一個(gè)對(duì)象Object有若干個(gè)參數(shù),而參數(shù)的名稱和數(shù)量是不確定的,想知道這種情況下數(shù)據(jù)表應(yīng)該怎么設(shè)計(jì)才會(huì)更適合Hibernate去操作.之前我弄過(guò)一個(gè)方案(想聽(tīng)大神吐槽):一共用到了兩個(gè)表:一個(gè)是tab表,一個(gè)是tabmeta表,并將tabmeta表中的tid參照tab的id創(chuàng)建外鍵(其實(shí)不想在數(shù)據(jù)庫(kù)中創(chuàng)建出這個(gè)關(guān)系,想在程序或者DAO層實(shí)現(xiàn)這樣的關(guān)系).
創(chuàng)建出對(duì)應(yīng)的實(shí)體類(用InteliJ IDEA的逆向工程直接通過(guò)表生成的):
//tab的實(shí)體類@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的實(shí)體類@Entity@Table(name = 'tabmeta', schema = 'springfkhibernate', catalog = '')public class TabmetaEntity { private int id; private String metakey; private String metavalue; //省略該有的getter和setter}
生成的時(shí)候的參數(shù):
但是這樣會(huì)搞出兩個(gè)實(shí)體類出來(lái),一個(gè)是TabEntity,一個(gè)是TabValueEntity,強(qiáng)迫癥表示不爽啊,本來(lái)這兩個(gè)表描述的是一個(gè)實(shí)體的問(wèn)題,而不是兩個(gè)具有一對(duì)多的兩個(gè)對(duì)象的關(guān)系.現(xiàn)在我想問(wèn)一下能不能實(shí)現(xiàn)在TabEntity中準(zhǔn)備一個(gè)類型為(Hash)Map的變量metas,專門(mén)用來(lái)存儲(chǔ)這些不確定的參數(shù),這樣就只有一個(gè)實(shí)體類了.但是這樣的話,數(shù)據(jù)在回存數(shù)據(jù)庫(kù)的時(shí)候又應(yīng)該怎么實(shí)現(xiàn)呢?現(xiàn)在這種方式產(chǎn)生的實(shí)體類如果想要訪問(wèn)其中的某一個(gè)不定參數(shù)的話,需要:TabDao.getEntity(...).getTabmetasById().get(’somekey’).getMetaValue()來(lái)實(shí)現(xiàn),但是如果把這兩個(gè)表的數(shù)據(jù)理解成一個(gè)實(shí)體的數(shù)據(jù)的話就應(yīng)該這么實(shí)現(xiàn):TabDao.getEntity(...).getMeta(’somekey’)不知道大神有沒(méi)有針對(duì)這方面的建議....另外想問(wèn)問(wèn)大神在IDEA的關(guān)系創(chuàng)建的對(duì)話框中每一項(xiàng)參數(shù)會(huì)產(chǎn)生怎樣的影響.
困惑比較大,還望大神們賜教!
問(wèn)題解答
回答1:又到了自問(wèn)自答的環(huán)節(jié)....如果說(shuō)實(shí)現(xiàn)我上面說(shuō)的那種方式,還要實(shí)現(xiàn)LazyLoad,IDEA自動(dòng)生成基本上是沒(méi)戲的....那個(gè)生成的功能是不包括建立非對(duì)象之間的關(guān)系的,如果需要建立,只能自己去改映射文件.先把那個(gè)tab表的實(shí)體類生成出來(lái),然后在tab的實(shí)體類中添加一個(gè)Map類型的對(duì)象(具體映射的類型看另一個(gè)表的字段數(shù)據(jù)類型),生成對(duì)應(yīng)的geter和seter函數(shù).然后就是map文件:
<map name='values' table='tabmeta'> <key column='tid' foreign-key='id'/><!--虛擬外鍵:誰(shuí)和誰(shuí)相等代表關(guān)系--> <index column='meta_key' type='string'/><!--Map的Key是誰(shuí)--> <element column='meta_value' type='double'/><!--Map的Value是誰(shuí)--></map>
相關(guān)文章:
1. node.js - nodejs+express+vue2. 使用mysql命令行連接遠(yuǎn)程數(shù)據(jù)庫(kù)host跳轉(zhuǎn)3. python - 如何把152753這個(gè)字符串轉(zhuǎn)變成時(shí)間格式15:27:534. javascript - onclick事件點(diǎn)擊不起作用5. java - web端百度網(wǎng)盤(pán)的一個(gè)操作為什么要分兩次請(qǐng)求服務(wù)器, 有什么好處嗎6. DADB.class.php文件的代碼怎么寫(xiě)7. python 字符串匹配問(wèn)題8. 數(shù)據(jù)庫(kù) - Mysql的存儲(chǔ)過(guò)程真的是個(gè)坑!求助下面的存儲(chǔ)過(guò)程哪里錯(cuò)啦,實(shí)在是找不到哪里的問(wèn)題了。9. javascript - 如何獲取未來(lái)元素的父元素在頁(yè)面中所有相同元素中是第幾個(gè)?10. python對(duì)8000行csv添加列

網(wǎng)公網(wǎng)安備