这里记录hibernate中组合主键的annotation方式。
hibernate-annotations说明文档中有说到组合主键使用annotation的方式实现,如下几种
下面是定义组合主键的几种语法:
1. 将组件类注解为@Embeddable,并将组件的属性注解为@Id
2. 将组件的属性注解为@EmbeddedId
3. 将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id
第一种方式实例:
1.主键类,如下
package com.seed.lee.model;
import javax.persistence.Column;
import javax.persistence.Embeddable;
/**
* 这个类作为Person类的(组合主键)主键类
*
* @author Administrator
*
*/
@Embeddable //这里就是annotation文档中所说的,将组件类注解为@Embeddable
public class PeopleUionPKID implements java.io.Serializable {
private String firstName;
private String secondName;
@Column(length=20)
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(length=20)
public String getSecondName() {
return secondName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof PeopleUionPKID){
PeopleUionPKID pk=(PeopleUionPKID)obj;
if(this.firstName.equals(pk.firstName)&&this.secondName.equals(pk.secondName)){
return true;
}
}
return false;
}
@Override
public int hashCode() {
return super.hashCode();
}
}
2.与数据库表对应的类
package com.seed.lee.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Peopel {
PeopleUionPKID uionPKID = new PeopleUionPKID();
private int age;
private String sex;
private String job;
@Id //这里就是文档中所述的,并将组件的属性注解为@Id
public PeopleUionPKID getUionPKID() {
return uionPKID;
}
public void setUionPKID(PeopleUionPKID uionPKID) {
this.uionPKID = uionPKID;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Column(length=4)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Column(length=20)
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
说明:除了代码中标为粗体的与普通的单主键类不同之外,其他都大同小异.
第二种方式比较简单
1.主键类,这个类不需要做任何的注解
package com.seed.lee.model;
import javax.persistence.Column;
/**
* 这个类作为Person类的(组合主键)主键类
*
* @author Administrator
*
*/
public class PeopleUionPKID implements java.io.Serializable {
private String firstName;
private String secondName;
@Column(length=20)
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(length=20)
public String getSecondName() {
return secondName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof PeopleUionPKID){
PeopleUionPKID pk=(PeopleUionPKID)obj;
if(this.firstName.equals(pk.firstName)&&this.secondName.equals(pk.secondName)){
return true;
}
}
return false;
}
@Override
public int hashCode() {
return super.hashCode();
}
}
2.数据表映射的类(只需要在主键类的引用中添加@EmbeddedId就可以)
package com.seed.lee.model;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Peopel {
PeopleUionPKID uionPKID = new PeopleUionPKID();
private int age;
private String sex;
private String job;
@EmbeddedId
public PeopleUionPKID getUionPKID() {
return uionPKID;
}
public void setUionPKID(PeopleUionPKID uionPKID) {
this.uionPKID = uionPKID;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Column(length=4)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Column(length=20)
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
第三种方式,这种方式相对麻烦一点,据说这种是符合常人的编码规范的,所以有很多人用
1. 依然需要主键类,类中不需要注解任何的属性
package com.seed.lee.model;
import javax.persistence.Column;
/**
* 这个类作为Person类的(组合主键)主键类
*
* @author Administrator
*
*/
public class PeopleUionPKID implements java.io.Serializable {
private String firstName;
private String secondName;
@Column(length=20)
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(length=20)
public String getSecondName() {
return secondName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof PeopleUionPKID){
PeopleUionPKID pk=(PeopleUionPKID)obj;
if(this.firstName.equals(pk.firstName)&&this.secondName.equals(pk.secondName)){
return true;
}
}
return false;
}
@Override
public int hashCode() {
return super.hashCode();
}
}
2.数据表对应的类(这个类中需要将表的组合主键也记录成属性,并在所有的主键字段的get方法上注解@id,最后就是在类名上方注解
@IdClass(value=PeopleUionPKID.class),PeopleUionPKID就是主键类的类短名
)
package com.seed.lee.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
@Entity
@IdClass(value=PeopleUionPKID.class)
public class Peopel {
// PeopleUionPKID uionPKID = new PeopleUionPKID();
private String firstName;
private String secondName;
private int age;
private String sex;
private String job;
// @EmbeddedId
// public PeopleUionPKID getUionPKID() {
// return uionPKID;
// }
//
// public void setUionPKID(PeopleUionPKID uionPKID) {
// this.uionPKID = uionPKID;
// }
public int getAge() {
return age;
}
@Id
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Id
public String getSecondName() {
return secondName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
public void setAge(int age) {
this.age = age;
}
@Column(length=4)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Column(length=20)
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
分享到:
相关推荐
第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 第6课 第一个示例Hibernate HelloWorld 7 ...2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........
- 默认情况下,Hibernate 使用`@GeneratedValue`来自动管理主键生成策略,如`GenerationType.IDENTITY`(自增列)、`GenerationType.SEQUENCE`(序列)或`GenerationType.AUTO`(根据数据库决定)。 3. **属性映射...
这里,@GeneratedValue用于指定主键生成策略,IDENTITY表示自动增长。 2.2 Column注解:用于指定字段映射到数据库的列名和类型,如: ```java @Column(name = "username", nullable = false) private String ...
默认情况下,Hibernate会使用`GenerationType.AUTO`策略生成主键,但也可以自定义生成策略,如`GenerationType.IDENTITY`或`GenerationType.SEQUENCE`。 3. **属性映射**:使用`@Column`注解可以将类的属性映射到...
- **@GeneratedValue**: 控制主键生成策略,如.AUTO(自增)、.SEQUENCE(序列)等。 - **@Temporal**: 用于日期时间类型的字段,指定时间存储格式,如TemporalType.DATE(日期)、TemporalType.TIME(时间)、...
3. Inheritance:Hibernate支持多种继承映射策略,如单表继承、联合继承和表-per-hierarchy。 四、关联映射 1. OneToMany/ManyToOne:一对多和多对一关系映射,使用@OneToMany和@ManyToOne注解,@JoinColumn定义...
- **联合主键**:当一个实体的主键由多个字段组成时,可以通过XML或Annotation方式指定联合主键。 #### Hibernate核心开发接口 - **Configuration/AnnotationConfiguration**:负责读取配置文件,初始化...
第13课专注于ID主键的生成策略,包括Xml方式和AnnotateOn方式,如AUTO、IDENTITY、SEQUENCE、TABLE等策略,并讨论了联合主键的配置。 第14课是核心内容,介绍了Hibernate的主要开发接口,如`Configuration...
例如,`@Entity`表示一个Java类对应数据库中的一个表,`@Id`标识主键,`@GeneratedValue`定义主键生成策略等。 3. **SessionFactory与Session**:在Hibernate中,SessionFactory是线程安全的,负责创建Session对象...
- `@Id`: 标记一个字段为实体的主键,通常与@GeneratedValue结合使用,指定主键生成策略。 - `@GeneratedValue`: 控制主键值如何生成,如自动增长、序列、UUID等。 - `@Column`: 定义字段的数据库列属性,如长度...
Hibernate还提供了组合主键等多种映射方式。 ### 11. 关系映射 Hibernate支持一对多、多对一、多对多等多种关系映射,包括单向和双向关联,并允许配置级联操作和延迟加载。 ### 12. 组合映射(Composition) 组合...
- **字段映射**: @Id、@GeneratedValue、@Column等注解的使用,定义主键生成策略和字段属性。 - **关联映射**: @OneToOne、@OneToMany、@ManyToOne、@ManyToMany等,处理对象之间的关系。 **4. Session操作** - **...
同时,探讨联合主键的概念及其在实际应用中的重要性。 #### 六、Hibernate核心开发接口深度剖析 - **API概览**:深入研究Hibernate API文档,重点关注`Configuration`、`SessionFactory`、`Session`、`SchemaExport...
触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一...
触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (optional) 5.1.9. property 5.1.10. 多对一...
触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对...
触发器实现的主键生成器(Primary keys assigned by triggers) 6.1.5. composite-id 6.1.6. 鉴别器(discriminator) 6.1.7. 版本(version)(可选) 6.1.8. timestamp (optional) 6.1.9. property 6.1.10. 多...
4. `@GeneratedValue`:配置主键生成策略,如.AUTO(自动选择策略)、.IDENTITY(数据库自增)、.SEQUENCE(序列)等。 5. `@Column`:定义字段如何映射到数据库表的列,可以设置列名、长度、是否允许为空等属性。 6...
1. `@GeneratedValue`:用于指定主键生成策略,如自增、UUID等。 2. `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`:这些注解用于定义实体间的关联关系,例如一对一、一对多、多对一和多对多。 3. `@...