首页  >  问答  >  正文

java - Hibernate如何处理参数数量不定的实体类

假设一个对象Object有若干个参数,而参数的名称和数量是不确定的,想知道这种情况下数据表应该怎么设计才会更适合Hibernate去操作.
之前我弄过一个方案(想听大神吐槽):
一共用到了两个表:一个是tab表,一个是tabmeta表,并将tabmeta表中的tid参照tab的id创建外键(其实不想在数据库中创建出这个关系,想在程序或者DAO层实现这样的关系).

创建出对应的实体类(用InteliJ IDEA的逆向工程直接通过表生成的):

//tab的实体类
@Entity
@Table(name = "tab", schema = "springfkhibernate", catalog = "")
public class TabEntity {
    private int id;
    private String name;
    private Map<Object, TabmetaEntity> tabmetasById;
    //省略一些该有的函数和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
}

生成的时候的参数:

但是这样会搞出两个实体类出来,一个是TabEntity,一个是TabValueEntity,强迫症表示不爽啊,本来这两个表描述的是一个实体的问题,而不是两个具有一对多的两个对象的关系.现在我想问一下能不能实现在TabEntity中准备一个类型为(Hash)Map的变量metas,专门用来存储这些不确定的参数,这样就只有一个实体类了.但是这样的话,数据在回存数据库的时候又应该怎么实现呢?
现在这种方式产生的实体类如果想要访问其中的某一个不定参数的话,需要:
TabDao.getEntity(...).getTabmetasById().get('somekey').getMetaValue()
来实现,但是如果把这两个表的数据理解成一个实体的数据的话就应该这么实现:
TabDao.getEntity(...).getMeta('somekey')
不知道大神有没有针对这方面的建议....
另外想问问大神在IDEA的关系创建的对话框中每一项参数会产生怎样的影响.

困惑比较大,还望大神们赐教!

我想大声告诉你我想大声告诉你2683 天前533

全部回复(1)我来回复

  • 滿天的星座

    滿天的星座2017-05-17 10:08:59

    又到了自问自答的环节....
    如果说实现我上面说的那种方式,还要实现LazyLoad,IDEA自动生成基本上是没戏的....那个生成的功能是不包括建立非对象之间的关系的,如果需要建立,只能自己去改映射文件.先把那个tab表的实体类生成出来,然后在tab的实体类中添加一个Map类型的对象(具体映射的类型看另一个表的字段数据类型),生成对应的geter和seter函数.
    然后就是map文件:

    <map name="values" table="tabmeta">
        <key column="tid" foreign-key="id"/><!--虚拟外键:谁和谁相等代表关系-->
        <index column="meta_key" type="string"/><!--Map的Key是谁-->
        <element column="meta_value" type="double"/><!--Map的Value是谁-->
    </map>

    回复
    0
  • 取消回复