知识大全 别让Hibernate偷走了你的标识符[5]
Posted 数据库
篇首语:我们这个世界,从不会给一个伤心的落伍者颁发奖牌。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 别让Hibernate偷走了你的标识符[5]相关的知识,希望对你有一定的参考价值。
别让Hibernate偷走了你的标识符[5] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Person类现在就简单多了
public class Person extends AbstractPersistentObject // Person specific fields and behavior here从上一个例子开始Hibernate映像文件就不会再改变了 我们不想麻烦Hibernate去了解抽象父类 相对的 我们只要保证每个持久化对象的映射文件包含一个id项(和一个被指派的生成器)和一个带有unsaved value= null 属性的version标签 机敏的读者可能已经注意到 每当一个持久化对象被实例化的时候 它的id值得到了指派 这意味着当Hibernate在内存中创建一个已经保存过的对象时 虽然这个对象是已经存在并从数据库中读取的 它也会得到一个新的id 这不会产生问题 因为Hibernate会接着调用对象的setId()方法 用保存的真实id来替换新分配的id 剩下的id生成器并不是问题 因为实现它的算法是轻量级的(也就是说 它并不牵扯到数据库)
到现在为止一切都很好 但是我们遗漏了一个重要的细节 如何实现IdGenerator createId() 我们可以为我们理想中的键值生成器(key generation)算法定义一些标准
● 键值可以不牵扯到数据库而很轻量级的产生
● 即使跨越不同的虚拟机和不同机器 键值也要保证唯一性
● 如果可能键值可以由其它程序 编程语言和数据库生成 至少要能和它们兼容
我们需要的是通用唯一标识符(UUID) UUID是由标准格式化的 个字节大小的( 位)数字组成的 UUID的字符串版本是像这样的 cdb cee f d a c ae c (大家应该可以注意到 Jmatrix目前就是使用的UUID)
里面的字符是数字简单的按字节的 进制表示 横线把数字的不同部分分割开来 这种格式简单而且易于处理 只是 个字符有点儿太长了 因为横线总是被安置在相同的位置 所以可以把它们去掉而把字符的数目减少到 个 用一种更为简洁的表示方法 你可以创建一个byte[ ]的数组或是两个 字节大小的长整型(long)来保存这些数字 如果你使用的是Java 或更高版本 你可以直接使用UUID类 虽然这不是它在内存中最简洁的格式 如果你要获得更多的信息 请参阅Wikipedia 的UUID条目 或 Java UUID参考文档
对UUID的产生算法有多种实现 既然最终UUID是一种标准格式 我们在IdGenerator类中采用哪一种实现都没有关系 既然无论采用什么算法每个id都会被保证唯一 我们甚至可以在任何时候改变算法的实现或是混合匹配不同的实现 如果你使用的是java 或更高版本 最方便的实现是java util UUID类
public class IdGenerator public static String createId() UUID uuid = java util UUID randomUUID();return uuid toString();对不使用java 或更高版本的人来说 至少有两种扩展库实现了UUID并且和 之前的java版本兼容 Apache Commons ID project 和 Java UUID Generator(JUG) project 它们都在Apache的旗下 (在LGPL之下JUG也是可用的)
这是使用JUG库实现IdGenerator的例子
import safehaus uuid UUIDGenerator;public class IdGenerator public static final UUIDGenerator uuidGen = UUIDGenerator getInstance(); public static String createId() UUID uuid = uuidGen generateRandomBasedUUID(); return uuid toString();Hibernate内置的UUID生成器算法又如何呢?这是一个得到验证对象标识用的UUID的适当途径吗?如果你想让对象标识符独立于对象的持久化 这就不是一个好方法 虽然Hibernate确实提供有让它为你生成UUID的选项 但这样的话我们又回到了那个最早的问题上 对象ID的获得并不在它们被创建的时候 而在它们被保存的时候
使用UUID作为数据库主键的最大障碍是它们在数据库中(而不是在内存中)的大小 在数据库中索引和外键的复合会促使主键大小的增加 你必须在不同的情况下使用不同的表示方法 使用String表示 数据库的主键大小将会是 或 字节 Id也可以直接使用位存储 这样将减少一半的占用空间 但是如果你直接查询数据库 id将变得难以理解 这些方法对你的工程是否可行取决于你的需求 如果你的数据库不接受UUID作为主键 你可以考虑使用数据库序列 但总是应该让新对象创建的时候被指派一个ID而不是让Hibernate管理你的ID 在这种情况下 创建新的域对象的商业对象可以调用一个使用data Access object(DAO)从数据库序列中获取数据库id的服务 如果你使用一个长整型来表示你的对象id 一个单独的数据库序列(以及服务方法)对你的域对象来说已经足够了
小结
当对象持久化到数据库中时 对象的标识符总时很难被恰当的实现 尽管如此 问题其实完全是由存在着在保存之前不持有ID的对象的现象衍生而来的 我们可以通过从诸如Hibernate这样的对象—关系映像框架手中取走指派对象ID的职责来解决这个问题 相对的 一旦对象被实例化 它就应该被指派一个ID 这使对象标识符变成简单而不易出错 也减少了领域模型中需要的代码量
cha138/Article/program/Java/ky/201311/28966相关参考
别让Hibernate偷走了你的标识符[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 下面
别让Hibernate偷走了你的标识符[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 当你
别让Hibernate偷走了你的标识符[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 当对
别让Hibernate偷走了你的标识符[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Hi
别让Hibernate偷走了您的身份 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 企业级Jav
求一篇诗歌,急!心灵之约谁偷走了你的青春谁搅乱你的舞步为何有早谢的花朵在枉费宝贵的桃李年华彷徨彷徨走不完命运的深巷何处是幸福的彼岸逃避逃避远离了万家灯火却挣不脱难言的忧烦放下你的包袱背起你的行囊年轻的
精通Hibernate:映射对象标识符 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java语
睡眠与生物钟障碍系列二别让失眠加速你的衰老睡眠是人类每天必不可少的生理活动。睡眠质量好坏、时间长短与人体健康、寿命长短息息相关。人过中年,不少人经常不能安眠,入睡难,易惊醒,多梦,醒后难再入睡。时间久
韩国留学生赵承熙在美国弗吉尼亚理工大学杀人事件,被人们广泛关注。为什么现代物质文明发展到了前所未有的水平,却经常出现自残和凶杀?有学说认为,当一个人经历了自认为不公正的待遇,或者经历了重大的挫折后,就
“模范丈夫”突然一反常态,执意要离婚,妻子极力挽救,可情况却变得越来越糟,这究竟是怎么了?芽让我们来看一看这位女士所面临的烦恼。一天,一位中年女士急匆匆地来到诊所。她的第一句话就是:“丈夫非要与我离婚