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. java - svn導(dǎo)下來(lái)的項(xiàng)目,web-inf下怎么沒(méi)有l(wèi)ib文件呀?2. 這是什么情況???3. 統(tǒng)計(jì) - MYSQL版本問(wèn)題導(dǎo)致SQL語(yǔ)法錯(cuò)誤!unknow column ’SQLSTR’4. initPage:是什么意思? 是返回的意思嗎?5. javascript - Vue.js2.0不能使用debounce后大伙一般是如何解決延遲請(qǐng)求的問(wèn)題的呢。6. Python的os.listdir在獲取文件列表時(shí)的順序問(wèn)題7. docker start -a dockername 老是卡住,什么情況?8. node.js - 關(guān)于你不知道的JavaScript上一書(shū)介紹的行為委托9. python - Pycharm的Debug用不了10. javascript - 這是什么插件能把能把cli里面的webpack打包信息格式化?
