针对你的情况,可以多用几个表就行,一个表 value_type(id,name,value_table)
一个表string_value(id,String),如果有int,就再加个表int_value.
value(id,pid,value_type_id,value_id)value_type(12,'年龄','int_value')
value_type(78,'姓名','string_value')String_value(33,'王')int_value(44,16)value(1,user_id,12,44)
value(2,user_id,78,33)简单的说,一般我们存姓名,直接在 姓名列加‘王’就行了。
但是现在要做的是。用一行数据要存 ‘王’。
这个数据本身有自己的id,然后有 表示这个数据的名称——‘姓名’,然后还有这个数据所在的表(string_value)和id。当然这种方法是不得已而为之。
如果先前对这样的功能需求不是很大,能定死,就定死吧。

解决方案 »

  1.   

    1楼的方法很方便简单。
    不过,当你新加一列的时候。要把所有数据都反序列一遍到没有添加属性的父类。再用父类的属性生成 一个子类。再把子类序列化更新到数据库。经过很多周折。
    不过你也可以考虑,把所有的属性都存在一个Map里面。直接反序列化,添加属性,再序列化更新。
    但是,这样的话,POJO类就是非标准了。而且效率未知。
      

  2.   

    这不是一个Hibernate的问题,这是基本的数据库结构。当你不能确定一个表有几列的时候,通常的解决办法是另建一个表,用以存储不定量的信息。比如说:
    表:用户(pk_user_id, username, password)
    表:用户信息(pk_userinfo_id, field_name, field_value, fk_user_id)
    这样不论有多少不确定的信息需要加入都可以解决了。这样做当然有其优缺点:
    优点:
    1 符合数据库结构的设计理念
    2 数据存储不受限制
    3 灵活性大缺点
    1 增加查找特定数据的复杂程度。如果你得到一个用户类,想要找到“婚否”的信息,那你需要循环所有这个用户的用户信息,直到找到field_name是“婚否”的记录。
    2 增加显示信息的难度。这样的信息一般在显示时需要所有的用户信息都显示在一行里,像这样:
      用户ID,username, 婚否,姓名,生日,学历
      但使用这个结构的结果是所有的用户信息在不同的行里,当需要显示在同一行的时候,就需要要么用很多outter join,要么在JAVA里用很多循环。具体的方法你自己选择吧。