今天用hibernate 查了几个表(这几个表只有 基本属性字段,没有 id )!查询数据时,还没什么问题!
就在 更新 数据时 ,因为这几个表中都没有 id ,调用 hibernate 的查询 方法时 ,提示
最后查找后 得知是 因为 hibernate 映射文件 中没有 id 找不到指定要更新的列 ;
这里的id 也就是 这个表的一个主键 ,也就是 只要哦找到一个 “主键”即可:
那么什么是:“主键”?
可以通过两种方式确定主键,
一种是基于实体类的复合主键,
另一种是通过定义主键类来实现。
不管通过哪种方式,复合主键都需要实现equals方法和hashcode方法,以作为不同数据之间是别的标志。
一.
基于实体类属性的复合主键
主键由实体类中的属性组成。
user.hbm.xml:
<?xmlversion="1.0"?> <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <classname="cn.blogjava.start.TUser"table="t_user"catalog="sample"> <composite-id> <key-propertyname="lastname"column="lastname"type="string"/> <key-propertyname="firstname"column="firstname"type="string"/> </composite-id> <propertyname="age"type="integer"column="age"/> </class> </hibernate-mapping>
po:
publicclassTUserimplementsjava.io.Serializable{ //Fields privateIntegerage; privateStringfirstname; privateStringlastname; publicIntegergetAge(){ returnage; } publicvoidsetAge(Integerage){ this.age=age; } publicStringgetFirstname(){ returnfirstname; } publicvoidsetFirstname(Stringfirstname){ this.firstname=firstname; } publicStringgetLastname(){ returnlastname; } publicvoidsetLastname(Stringlastname){ this.lastname=lastname; } 自己实现 equals和hashCode ........
既然 找到了 “主键” hibernate 就被欺骗了 !我们就可以用hibernate 进行操作了