hibernate 注解 联合主键映射
联合主键用Hibernate注解映射方式主要有三种:
第一、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将
该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并生成set和get方法,并将该引用注
解为@Id
第二、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,最后
在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并生成set和get方法,并将该引用注解为@EmbeddedId
第三、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并要重写equals和hashcode.
最后在主类中(该类包含联合主键类中的字段)将联合主键字段都注解为@Id,并在该类上方将上这样的注解:@IdClass(联合主键类.class)
@Column —— 注解声明了属性到列的映射。该注解有如下的属性
name 可选,列名(默认值是属性名)
unique 可选,是否在该列上设置唯一约束(默认值false)
nullable 可选,是否设置该列的值可以为空(默认值false)
insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)
updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)
columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植)
table 可选,定义对应的表(默认为主表)
length 可选,列长度(默认值255)
precision 可选,列十进制精度(decimal precision)(默认值0)
scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0)
precision属性和scale属性表示精度时,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
@Digits(integer=12, fraction=3)
检查此值是否是一个数字,并且这个数字的整数部分不超过integer定义的位数, 和小数部分不超过fraction 定义的位数.[对应的数据库表字段会被设置精度(precision)和准度(scale)]
检查所给的字符串是否符合email地址的格式
@Future
检查给定的日期是否比现在晚
@Past
检查标注对象中的值表示的日期比当前早.
@Length(min=, max=)
检查该字符串的长度是否在min 和 max规定的范围内.[对应的数据库表字段的长度会被设置成约束中定义的最大值]
@Max
检查该值是否小于或等于约束条件中指定的最大值.[会给对应的数据库表字段添加一个check的约束条件]
@NotNull
检查该值不为null[对应的表字段不允许为null]
@NotBlank
检查该字符串不为null,并且不是空字符串. 本约束和下面的@NotEmpty的不同之处在于,本约束只能被用在字符串类型上,并且会忽略字符串尾部的空
@NotEmpty
检查该值不为null同时也不为空.
@Null
检查该值应该为null.
@Range(min=, max=)
检查该值是否在[min, max)之间
@Size(min=, max=)
检查该值的size是否在[min, max)之间.[对应的数据库表字段的长度会被设置成约束中定义的最大值.]
@URL(protocol=, host=, port=)
判断该值是否是一个有效的URL, 如果给出了约束中的protocol, host 或 port 参数的话,那个被校验的值需要和其匹配.
@Valid
递归得对关联对象进行校验, 如果关联对象是个集合或者数组, 那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.
@Transient
表示该属性并非是一个到数据库表的字段的映射,ORM框架将忽略该属性.
被注解成 @Transient 的 getter 方法或属性,将不会被持久化,hibernate 会忽略这些字段和属性。
如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic
@Basic
所有没有定义注解的属性,等价于在其上面添加了 @Basic 注解。通过 @Basic注解可以声明属性的获取策略 ( fetch strategy ),默认的是即时获取(early fetch),这里又讨论到了
延迟关联获取和延迟属性获取,通常不需要对简单属性设置延迟获取,如需要定义@Basic(fetch=FetchType.LAZY)
通过@Basic注解可以声明属性的获取策略(lazy与否),默认的是即时获取(early fetch),这里又讨论到了
延迟关联获取和延迟属性获取,通常不需要对简单属性设置延迟获取,如需要定义@Basic(fetch=FetchType.LAZY)
@OrderBy(value = "id ASC")
指明加载OrderItem 时按id 的升序排序
hierbate search注解【基于lucene】
@DateBridge(resolution
= Resolution.SECOND)
因为lucene有些版本现在貌似只能对字符串进行索引【新的版本貌似支持数值索引】,所有date类型需要转换成
string,Resolution.SECOND就是解析成秒格式的字符串,有以下参数
Resolution.YEAR: yyyy
Resolution.MONTH: yyyyMM
Resolution.DAY: yyyyMMdd
Resolution.HOUR: yyyyMMddHH
Resolution.MINUTE: yyyyMMddHHmm
Resolution.SECOND: yyyyMMddHHmmss
Resolution.MILLISECOND: yyyyMMddHHmmssSSS
@MappedSuperclass
基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个共同属性封装到非实体类中,适合父类和子类的关系
0、 @MappedSuperclass注解只能标注在类上
1、标注为@MappedSuperclass的类将不是一个完整的实体类,他不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。
2、标注为@MappedSuperclass的类不能再标注@Entity或@Table注解,也无需实现序列化接口。
3、如果一个标注为@MappedSuperclass的类继承了另外一个实体类或者另外一个同样标注了@MappedSuperclass的类的话,他将可以使用@AttributeOverride或@AttributeOverrides注解重定义其父类(无论是否是实体类)的属性映射到数据库表中的字段。比如可以重定义字段名或长度等属性,使用@AttributeOverride中的子属性@Column进行具体的定义。
注意:对于其父类中标注@Lob注解的属性将不能重载,并且@AttributeOverride里的@Column设置都将不起作用。JPA规范中对@Lob注解并没有说明不能同时标注@Column注解,但是在实际使用中Hibernate JPA不支持这种标注方式。
4、标注为@MappedSuperclass的类其属性最好设置为protected或default类型的,以保证其同一个包下的子类可以直接调用它的属性。
public class BmRoRolerightmatrixPK implements Serializable{ private static final long serialVersionUID = 1L; private Long actId;//功能操作ID
private Long roleId;//角色ID @Column(name = "ACT_ID",unique = false,nullable = true,length = 10)
public Long getActId() {
return actId;
}
public void setActId(Long actId) {
this.actId = actId;
} @Column(name = "ROLE_ID",unique = false,nullable = true,length = 10)
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
} }
@Entity
@IdClass(BmRoRolerightmatrixPK.class)
@Table(name = "BM_RO_ROLERIGHTMATRIX")
public class BmRoRolerightmatrix implements Serializable{
private static final long serialVersionUID = 1L;
public BmRoRolerightmatrix(){}
//属性
private Long actId;//功能操作ID private Long roleId;//角色ID @Id
public Long getActId() {
return this.actId;
} @Id
public Long getRoleId() {
return this.roleId;
}
...
public class WalletBalanceId implements Serializable{ /**
*
*/
private static final long serialVersionUID = -6967634249077311858L; /***
* CID 客户号
*/
@ManyToOne
@JoinColumn(name = "CID")
private Customer customer; /***
* 理财账号
*/
@Column(name = "ACCT_NO")
private String acctNo; public WalletBalanceId() {
super();
} public WalletBalanceId(Customer customer, String acctNo) {
super();
this.customer = customer;
this.acctNo = acctNo;
} public Customer getCustomer() {
return customer;
} public void setCustomer(Customer customer) {
this.customer = customer;
} public String getAcctNo() {
return acctNo;
} public void setAcctNo(String acctNo) {
this.acctNo = acctNo;
} @Override
public String toString() {
return ReflectionToStringBuilder.toString(this,
ToStringStyle.SHORT_PREFIX_STYLE);
}
}
@Entity
@Table(name = "T_WALLET_BALANCE")
@IdClass(WalletBalanceId.class)
public class WalletBalance implements Serializable { /**
*
*/
private static final long serialVersionUID = -4041192003429561466L; /***
* CID(主键) 客户号
*/
@Id
@ManyToOne
@JoinColumn(name = "CID")
private Customer customer; /***
* 理财账号
*/
@Id
@Column(name = "ACCT_NO")
private String acctNo; /***
* 总金额
*/
@Column(name = "TOTAL_AMT")
private BigDecimal totalAmt; /***
* 资金状态
*/
@Column(name = "FUND_STATE")
private String fundState; /***
* 更新日期
*/
@Column(name = "UPD_DATE")
private Date updDate; public WalletBalance() {
super();
} public Customer getCustomer() {
return customer;
} public void setCustomer(Customer customer) {
this.customer = customer;
} public String getAcctNo() {
return acctNo;
} public void setAcctNo(String acctNo) {
this.acctNo = acctNo;
} public BigDecimal getTotalAmt() {
return totalAmt;
} public void setTotalAmt(BigDecimal totalAmt) {
this.totalAmt = totalAmt;
} public String getFundState() {
return fundState;
} public void setFundState(String fundState) {
this.fundState = fundState;
} public Date getUpdDate() {
return updDate;
} public void setUpdDate(Date updDate) {
this.updDate = updDate;
} @Override
public String toString() {
return ReflectionToStringBuilder.toString(this,
ToStringStyle.SHORT_PREFIX_STYLE);
}
}
public class CplsPK extends BaseObject { public String getCpzxh() {
return cpzxh;
}
public void setCpzxh(String cpzxh) {
this.cpzxh = cpzxh;
} public String getXtgzh() {
return xtgzh;
}
public void setXtgzh(String xtgzh) {
this.xtgzh = xtgzh;
} public String getDqdh() {
return dqdh;
}
public void setDqdh(String dqdh) {
this.dqdh = dqdh;
}
private String cpzxh;
private String xtgzh;
private String dqdh; }
@Entity
@Table(name = "sim_cpls",catalog="yyptsim")
@IdClass(com.yyptsim.dbmap.CplsPK.class)
public class Cpls extends BaseObject{ private String cpzxh;
private String xtgzh;
private String dqdh;
private String syckh;//索引参考号8位长度,用于冲正用
private String jygy;
private String gylsh;
private String qsrq;
private String transtime;
private String sllwhbh;
private String sljgbsm;
private String jsjgbsm;
private String jydm;
private String sllwhjydm;
private String msgid;
private String zhdh;
private String jdbj;
private double zhye;
private String xym;
private double jyje;
private String jlzt; public Cpls(String cpzxh,String xtgzh,String dqdh,String syckh,String jygy,String gylsh,String qsrq,String transtime,String sllwhbh,String sljgbsm,String jsjgbsm,String jydm,String sllwhjydm,String msgid,String zhdh,String jdbj,double zhye,String xym,double jyje,String jlzt) {
this.cpzxh=cpzxh;
this.xtgzh=xtgzh;
this.dqdh=dqdh;
this.syckh=syckh;
this.jygy=jygy;
this.gylsh=gylsh;
this.qsrq=qsrq;
this.transtime=transtime;
this.sllwhbh=sllwhbh;
this.sljgbsm=sljgbsm;
this.jsjgbsm=jsjgbsm;
this.jydm=jydm;
this.sllwhjydm=sllwhjydm;
this.msgid=msgid;
this.zhdh=zhdh;
this.jdbj=jdbj;
this.zhye=zhye;
this.xym=xym;
this.jyje=jyje;
this.jlzt=jlzt; } public Cpls()
{ } public void setCpzxh(String cpzxh)
{
this.cpzxh = cpzxh;
}
@Id
@Column(name="cpzxh")
public String getCpzxh()
{
return cpzxh;
}
@Id
@Column(name="xtgzh")
public String getXtgzh()
{
return xtgzh;
} public void setXtgzh(String xtgzh)
{
this.xtgzh = xtgzh;
} public void setDqdh(String dqdh)
{
this.dqdh = dqdh;
} @Id
@Column(name="dqdh")
public String getDqdh()
{
return dqdh;
} public void setSyckh(String syckh)
{
this.syckh = syckh;
} @Basic
@Column(name="syckh")
public String getsyckh()
{
return syckh;
}
@Basic
@Column(name="jygy")
public String getJygy()
{
return jygy;
}
public void setJygy(String jygy)
{
this.jygy = jygy;
}
@Basic
@Column(name="gylsh")
public String getGylsh()
{
return gylsh;
} public void setGylsh(String gylsh)
{
this.gylsh = gylsh;
}
public void setQsrq(String qsrq)
{
this.qsrq = qsrq;
}
@Basic
@Column(name="qsrq")
public String getQsrq()
{
return qsrq;
} public void setTranstime(String transtime)
{
this.transtime = transtime;
}
@Basic
@Column(name="transtime")
public String getTranstime()
{
return transtime;
}
@Basic
@Column(name="sllwhbh")
public String getSllwhbh()
{
return sllwhbh;
} public void setSllwhbh(String sllwhbh)
{
this.sllwhbh = sllwhbh;
}
@Basic
@Column(name="sljgbsm")
public String getSljgbsm()
{
return sljgbsm;
} public void setSljgbsm(String sljgbsm)
{
this.sljgbsm = sljgbsm;
} public void setJsjgbsm(String jsjgbsm)
{
this.jsjgbsm = jsjgbsm;
}
@Basic
@Column(name="jsjgbsm")
public String getJsjgbsm()
{
return jsjgbsm;
} public void setJydm(String jydm)
{
this.jydm = jydm;
}
@Basic
@Column(name="jydm")
public String getJydm()
{
return jydm;
} public void setMsgid(String msgid)
{
this.msgid = msgid;
}
@Basic
@Column(name="msgid")
public String getMsgid()
{
return msgid;
}
@Basic
@Column(name="sllwhjydm")
public String getSllwhjydm()
{
return sllwhjydm;
} public void setSllwhjydm(String sllwhjydm)
{
this.sllwhjydm = sllwhjydm;
} public void setZhdh(String zhdh)
{
this.zhdh = zhdh;
}
@Basic
@Column(name="zhdh")
public String getZhdh()
{
return zhdh;
} @Basic
@Column(name="jdbj")
public String getJdbj()
{
return jdbj;
} public void setJdbj(String jdbj)
{
this.jdbj = jdbj;
}
@Basic
@Column(name="zhye")
public double getZhye()
{
return zhye;
} public void setZhye(double zhye)
{
this.zhye = zhye;
} public void setXym(String xym)
{
this.xym = xym;
}
@Basic
@Column(name="xym")
public String getXym()
{
return xym;
} @Basic
@Column(name="jyje")
public double getJyje()
{
return jyje;
} public void setJyje(double jyje)
{
this.jyje = jyje;
} public void setJlzt(String jlzt)
{
this.jlzt = jlzt;
}
@Basic
@Column(name="jlzt")
public String getJlzt()
{
return jlzt;
} }
hibernate 注解 联合主键映射的更多相关文章
- Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)
Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessio ...
- hibernate里联合主键composite-id映射,查询单个主键的问题
今天项目中遇到这个问题,搞了大半天,现在记录下来hibernate里联合主键配置(多个字段一起作为主键) <class name="com.cskj.hibernate.map.BbW ...
- Hibernate联合主键映射
1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列. Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法, ...
- hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同
基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化 ...
- hibernate笔记--组合主键映射方法
一个数据库表中其主键有可能不止一个属性,同样映射到实体类中,可能有两个或多个属性共同配置成为一个主键,假设一个实体类Score,其主键有两个属性stuId(学生编号)和subjectId(科目编号), ...
- Hibernate之基于主键映射的一对一关联关系
1. 基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键.并用<param> 子元素指定使用当 ...
- hibernate MTM 联合主键
//适用于表里没有其他列,只有主键 //Course.java实体类 package com.tao.pojo; import java.util.HashSet; import java.util. ...
- java之hibernate之组合主键映射
1.在应用中经常会有主键是由2个或多个字段组合而成的.比如成绩表: 第一种方式:把主键写为单独的类 2.类的设计:studentId,subjectId ,这两个主键是一个组件.所以可以采用组件映射的 ...
- Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A ...
随机推荐
- XShell 使用方法
XShell是一款Windows下非常优秀的远程连接Linux主机的工具,是平常使用不可缺少的工具.复制和粘贴由于在linux的Shell下,Ctrl+c是中断当前指令,这个快捷键和win系统下的复制 ...
- 替换openjdk的版本时遇到报错Transaction check error
x想要使用jmap对jvm内存进行排查问题,但是默认安装的openjdk包中并不带有这个命令,需要新升级到新版本才有 而在安装新的版本时,遇到报错: : file /usr/lib64/libns ...
- hadoop2.5搭建过程
1 搭建环境所使用的资源 VMware Workstation 9 ubuntu-14.04.2-desktop-amd64.iso jdk-7u80-linux-x64.tar.gz hadoop- ...
- Spring Cloud微服务视频教程-百度云
Spring Cloud微服务视频教程-百度云 链接:https://pan.baidu.com/s/1mp8SkxNw7EfoTDtDKQMpIA 提取码: 关注公众号[GitHubCN]回复521 ...
- 关于 win10 创建WiFi热点 问题(无法启动承载网络 , 我们无法设置移动热点,因为你的电脑未建立以太网,wifi或手机网络数据连接 )
电脑创建WiFi,一般三种办法: 1. WiFi共享软件:猎豹wifi.wifi共享精灵.wifi共享大师..... 2. 命令提示符 netsh wlan set hostednetwork mod ...
- .NET工作准备--01前言
01应聘须知(已过时) -1.了解软件开发大环境.-2.准备简历:不宜超过一页,永远准备中文,模板. -3.渠道:3大网站,中华英才,前程无忧(51job最给力),智联招聘.现在还有猎聘网和100程序 ...
- Android-IntentFilter
Android-IntentFilter 学习自 <Android开发艺术探索> IntentFilter漫谈 众所周知,在Android中如果要想启动一个Activity,有两种方式,显 ...
- 【BZOJ 1061】 1061: [Noi2008]志愿者招募 (线性规划与网络流)**
1061: [Noi2008]志愿者招募 Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短 ...
- 【转载】CMenu自绘---钩子---去除边框
使用默认的CMenu菜单类或者继承CMenu实现的菜单扩展类,在显示的时候最外层都会有边框出现,或者说是具有3D外观(菜单阴影不算),当改变菜单背景色或者需要加个边框线时就会看上去很不美观.看过很多菜 ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) F. Souvenirs 线段树套set
F. Souvenirs 题目连接: http://codeforces.com/contest/765/problem/F Description Artsem is on vacation and ...