hibernate 联合主键 composite-id
<key-property name="stationNum" type="java.lang.String" column="STATIONNUM"/>
<key-property name="observTimes" type="java.util.Date" column="OBSERVTIMES"/>
</composite-id>
在持久化类必须重载equals()和hashCode()方法,来实现组合的标示符的相等判断,实现Serializable接口也是必须的。
不幸的是,这种组合关键字的方法意味着一个持久化类是它自己的标识。除了对象自己之外, 没有什么方便的“把手”可用。你必须初始化持久化类的实例,填充它的标识符属性,再load() 组合关键字关联的持久状态。我们把这种方法称为embedded(嵌入式)的组合标识符,在重要的应用中不鼓励使用这种用法。
第二种方法我们称为mapped(映射式)组合标识符 (mapped composite identifier),<composite-id>元素中列出的标识属性不但在持久化类出现,还形成一个独立的标识符类。
<composite-id name="id" class="hibernate.RainId">
<key-property name="stationNum" type="string">
<column name="StationNum" length="5" />
</key-property>
<key-property name="observTimes" type="timestamp">
<column name="ObservTimes" length="19" />
</key-property>
</composite-id>
在这个例子中,组合标示符类RainId和实体类都含有stationNum和observTimes属性,标示符必须重载equals()和hashCode()并且实现Serializable接口。这种方法的缺点是出现了明显的代码重复。
mapped (可选, 默认为false): 指明使用一个映射式组合标识符,其包含的属性映射同时在实体类和组合标识符类中出现。
hibernate应该使用的访问此属性值的策略
例子:
POJO类
public class Rain implements java.io.Serializable {
private RainId id;//联合主键
private Date insertTimes;
private Integer precipitation;
private Integer threePrecip;
private Integer sixPrecip;
private Integer twelvePrecip;
private Integer twentyFourPrecip;
private Integer minuteRain0;
private Integer minuteRain1;
联合主键bean
public class RainId implements java.io.Serializable {
private String stationNum;
private Date observTimes;
public RainId() {
}
public RainId(String stationNum, Date observTimes) {
this.stationNum = stationNum;
this.observTimes = observTimes;
}
if ((this == other))
return true;
if ((other == null))
return false;
if (!(other instanceof RainId))
return false;
RainId castOther = (RainId) other;
return ((this.getStationNum() == castOther.getStationNum()) || (this
.getStationNum() != null && castOther.getStationNum() != null && this
.getStationNum().equals(castOther.getStationNum())))
&& ((this.getObservTimes() == castOther.getObservTimes()) || (this
.getObservTimes() != null
&& castOther.getObservTimes() != null && this
.getObservTimes().equals(castOther.getObservTimes())));
}
public int hashCode() {
int result = 17;
result = 37
* result
+ (getStationNum() == null ? 0 : this.getStationNum()
.hashCode());
result = 37
* result
+ (getObservTimes() == null ? 0 : this.getObservTimes()
.hashCode());
return result;
}
<class name="hibernate.Rain" table="rain" catalog="base">
<composite-id name="id" class="hibernate.RainId">
<key-property name="stationNum" type="string">
<column name="StationNum" length="5" />
</key-property>
<key-property name="observTimes" type="timestamp">
<column name="ObservTimes" length="19" />
</key-property>
</composite-id>
<property name="insertTimes" type="timestamp">
<column name="InsertTimes" length="19" />
</property>
在实际的开发当中我发现,如果联合主键中的某一字段为空值,那么将会导致通过该联合主键查询出来的结果为空值,这个问题不知道是hibernate的bug还是spring集成hibernate时产生的问题,总之在实际使用的时候最好保证作为联合主键的字段都是有值的。
2、主键容易冲突
hibernate联合主键的另一个弊端就是存在主键重复的隐患,如果将某几个字段做为联合主键,在这些字段更新之后很可能造成重复,但数据库中并不会报错(存在其他不相同的字段),然而hibernate却会报主键重复的错误。
hibernate 联合主键 composite-id的更多相关文章
- hibernate 联合主键生成机制(组合主键XML配置方式)
hibernate 联合主键生成机制(组合主键XML配置方式) 如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体 ...
- 这是一个hibernate 联合主键的例子
package com.bird.entity; import java.io.Serializable; import javax.persistence.Entity; import javax. ...
- Java进阶知识05 Hibernate联合主键之Annotation(注解)和XML实现方式
1.Hibernate联合主键(Annotation实现) 1.1.单列主键 1.1.1.为什么要有主键? //唯一确定一条记录 1.1.2.一个表能否有多个主键? //不能 1.1.3. ...
- hibernate 联合主键
xml方式处理联合主键: 以有两个主键:id和name的student表为例. 先创建个主键类: package com.bjsxt.hibernate; //黑色为必写项 public ...
- Hibernate联合主键映射
1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列. Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法, ...
- hibernate ——联合主键
接上一篇博客:http://www.cnblogs.com/tengpan-cn/p/5551323.html 主键类不需要写任何注解,表对象类使用@IdClass注解 在表对象类前面加@IdClas ...
- hibernate联合主键 注解方式
转载自https://my.oschina.net/yotoo/blog/265571 方法一:主键类用@Embeddable,pojo类仍然用@Entity但是引用主键类的对象用@Id 主键pojo ...
- hibernate联合主键注解配置
在网上看到好多方法,结果拿来用还是出现了一些问题.现在整理一下 1.主键类 import javax.persistence.Column; public class UserRoleUionPK i ...
- hibernate联合主键注解方式
方法一:主键类用@Embeddable,pojo类仍然用@Entity但是引用主键类的对象用@Id 主键pojo类: @Embeddable public class composeIdPK impl ...
随机推荐
- 总结一下Java基础知识
重中之重-----------基础 底层结构决定上层建筑,所以,基础很重要. 自信心 在开始说基础之前先说明一下自信心的重要性,没有自信心学什么东西都学不好. 核心自信***** 核心自信从三个方面来 ...
- pd.cut和pd.qcut()之间的区别
- LGP6144题解
冲了50分钟外加10分钟厕所才冲出来,请问我还有救吗. 看上去像是金组题目的加强版,实际上是金组题目的魔改版. 还是考虑像弱化版那样按照左端点排序,并且记录答案的 \(0\sim k\) 次幂和. 然 ...
- vue路由传参丢失问题
vue路由传递参数如果用params传递参数,那么页面刷新就会丢失数据,可以改用query来传递参数,这样刷新就不会丢失
- LCD1602----LiquidCrystal库的使用1
一:硬件介绍: 1.引脚定义: 2.屏幕介绍: 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母.数字.符号的点阵型液晶模块.它是由若干个5x7或者5x10的点阵字符位组成,每个点阵字符位 ...
- ArcMap操作随记(7)
1.栅格分辨率调整 [重采样] 2.点集数据对插值模型精度检验 test数据→[子集要素](地统计分析)→train→[插值]→[多值提取至点]→[字段计算器](Abs([value]-[spline ...
- Hibernate学习笔记(一)-->数据库单表操作
Hibernate框架是一个全ORM映射框架,是一个非常流行的数据库操作框架之一,现在比较流行的还有MyBatis半ORM映射框架 在MyEclipse IDE开发工具中,可以很轻松的搭建Hibern ...
- Spring系列26:Spring AOP 通知与顺序详解
本文内容 如何声明通知 如何传递参数到通知方法中 多种通知多个切面的通知顺序 多个切面通知的顺序源码分析与图解 声明通知 Spring中有5种通知,通过对应的注解来声明: @BeforeBefore ...
- docker 部署mysql tomcat时 在root@localhost~下——-——docker exec -it 容器名 /bin/bash 报错
在docker部署mysql时 报错 找不到 容器不自动启动 , docker start 容器名 也没有效果 多次尝试发现 原因是创建容器时在 下面创建的 更改为下创建 问题解决
- Spring Boot 自定义Starter 可能引发的问题(Error)
如果你的项目出现: Consider defining a bean of type 'com.wy.helloworld_spring_boot_starter.PersonService' in ...