论坛首页 Java版 Hibernate

[讨论] 如何把Array mapping到数据库

浏览 1880 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2004-11-24
偶现在有一个Object, 里面有一个String Array的属性
public class Bar {
    private String[] foos;
}

现在需要把它用Hibernate持久化到数据库, 目前有2种做法:
1. 什么都不管, 让Hibernate来处理, mapping文件就是:
<property name="foos"/>
这样column 的类型就是binary

2. 使用一个UserType
<property name="foos" type="StringArrayType"/>
把String[] 转化成为一个String (比如通过添加一个逗号隔离符, 把{"abc", "efg"} <-> "abc,efg"), 再把它save下来.

1的缺点是数据库里的值是2进制, 查看数据库的话, 不够直观.
2的缺点是需要绕一个弯, 隔离符号要选择好, 要注意避免和传入的String[]有冲突.

不知道在Hibernate里面推荐的做法是什么呢?
   
最后更新时间:2004-11-24
如果我,会选择2,这样数据库里面保存的东西比较直观,可以直接修改,否则除了Java程序,就没有办法用其他工具来维护数据库了,同时也比较好进行更多的运算,例如全文检索什么的。
   
0 请登录后投票
最后更新时间:2004-11-24
如果是我,就直接用String了,都有了隔离符还怕什么,直接应用里面SPLIT代价更小。
   
0 请登录后投票
最后更新时间:2004-11-24
不要直接持久化foos,弄一个字段保存整个字符串。然后再在实体里getfoos(return split(xx));
setfoos(xx = merge(foos))
   
0 请登录后投票
最后更新时间:2004-11-24
还是采用2的方法了.

先别说在偶这里对这个对象偶无法改动, 即便是可以改动, 那么增加一个字段之类的做法也是太麻烦了, 如果你的Object有多个这样String Array的属性呢? 岂不是得增加多个String, 以及对应的getters/setters, 不爽......
   
0 请登录后投票
最后更新时间:2004-11-24
为什么不map到一个list?2的方法除了你说的缺点外,查询起来也麻烦,譬如说查询所有含有%abc%的foo
   
0 请登录后投票
最后更新时间:2004-11-24
把一个String Array属性map到一个list? 偶在hibernate的文档上找不到这样的做法呀, 
   
0 请登录后投票
最后更新时间:2004-11-24
映射对象数组倒是做过,
映射一个String倒是没有用过,不过应该一样吧,你试试?

6.2. 映射集合(Mapping a Collection)
在Hibernate配置文件中使用<set>, <list>, <map>, <bag>, <array> 和 <primitive-array>等元素来定义集合
   
0 请登录后投票
最后更新时间:2004-11-24
映射对象数组是映射到另外一个持久化对象, 偶这里只是一个简单的String[], 不想再弄一张表出来存这些东东阿......
   
0 请登录后投票
最后更新时间:2004-11-25
集合也可以映射到string,不一定是持久化对象,不过是要另外一张表存放这些数据。
[code:1]
<bag name="foos" cascade="all">
    <key column="bar_id"/>
    <element column="foo" type="string" length="50"/>
</bag>
[/code:1]
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐