日期:2014-05-20  浏览次数:20642 次

关于hibernate中id的问题(应该很基础,希望大家指教)
初学hibernate 对其中的一些知识点还不是很清楚,请大家指教
假如我现在又一下一个POJO类
Java code

public class Person{
    private long oid;
    private int id;
    private String name;
    private int age;
}


现在我Person类有以下这么多个属性,可以想象还有许多的类和这个类之间存在关系!如果不用hibernate,我完全可以把id作为主键
但是老实说如果用hibernate这样不好.最好设计一个公共主键oid.这点我不是很明白为什么啊?什么情况下应该用公共主键,什么时候
就不用呢?

还有一个问题,是说hibernate会自动认为你的第一个属性就是主键吗?
大家就这个主键的问题可以展开给我讲讲!谢谢

------解决方案--------------------
主键就是一个coder用来区分其他记录(唯一确定一条记录)的东东,它和实际对象没有直接关系。
如果你的id对于person来说是一个有意义的东西,那么设计另外一个字段。
------解决方案--------------------
如果有业务含义,那就没办法让数据库或者hibernate给你自动生成啦,当然你非得自己定义主键也不是不可以
------解决方案--------------------
如果定义的主键有业务含义,那在hibernate自动解析的时候,不知道怎么去解析成相应的SQL语句,所以会定义一个无业务含义的属性,hibernate会使用自身的算法来维护主键,如果一定要使用有业务含义的主键,就得有程序员来维护主键了
------解决方案--------------------
学习
------解决方案--------------------
探讨
引用:
没懂你的意思啊,有一个无业务的主键就可以。至于主键的生成方式有你来决定,比如数据库生成,hibernate生成等。


对,就是这个问题,为什么一定要有一个无业务含义的主键呢?

------解决方案--------------------
使用跟业务无关的主键不仅仅是hibernate的推荐方式,也是任何数据库设计的的推荐方式。

因为,如果主键设置跟业务有关的话,以后需求稍有编号,可能会引起严重后果。比如原来的认为某个属性不会有重复值,单后来需求会导致某个属性有重复值。

至于标记那个是id,可以在配置文件里面声明:

XML code
<id
name="propertyName"
(1)
type="typename"
(2)
column="column_name"
(3)
unsaved-value="null|any|none|undefined|id_value"
(4)
access="field|property|ClassName">
(5)
node="element-name|@attribute-name|element/@attribute|."
<generator class="generatorClass"/>
</id>

------解决方案--------------------
11楼的例子已经很形象了.
------解决方案--------------------
相当于一个标记,以免某些情况跟业务层发生冲突^
------解决方案--------------------
你所谓的公共主键就是一个与业务逻辑无关的代理主键,这样是为了跟业务逻辑分开
------解决方案--------------------