注解开发嵌入式主键@EmbeddedId

用于定义复合主键 

方法1:  

(1)编写一个嵌入式主键的类Demo

作为嵌入式主键类,要满足以下几点要求。 

1.必须实现Serializable接口、必须有默认的public无参数的构造方法、必须覆盖equals 和hashCode方法,这些要求与使用复合主键的要求相同。 

2.将嵌入式主键类使用@Embeddable标注,表示这个是一个嵌入式类。 

@Embeddable 
public class Demo
  private String firstName; 

  private String lastName; 

  public Demo() { 
  } 

  public String getFirstName() { 
    return firstName; 
  } 

  public void setFirstName(String firstName) { 
    this.firstName = firstName; 
  } 

  public String getLastName() { 
    return lastName; 
  } 

  public void setLastName(String lastName) { 
    this.lastName = lastName; 
  } 

  @Override 
  public boolean equals(Object o) { 
     demo other = (demo) obj; 
     EqualsBuilder builder = new EqualsBuilder(); 
     builder.append(firstName,       other.firstName).append(lastName,other.lastName); 
     boolean equals = builder.isEquals(); 
     return equals; 
  } 

  @Override 
  public int hashCode() { 
    HashCodeBuilder builder = new HashCodeBuilder(); 
    builder.append(firstName).append(lastName); 
    int code = builder.hashCode(); 
    return code; 
  } 


(2)通过@EmbeddedId注释标注实体中的嵌入式主键 

注意: 
1.必须要实现serializable接口 

2.需要有无参的构造函数 

3.@Embeddable注释,表示此类可以被插入某个entity中 

4.两个class和Column的列名都必需与表里的列名一致,建立sql时,会自动选择TestPK里的列名 

@Entity 
@Table(name = "schemaname.tablename") 
public class Test { 
  @EmbeddedId 
  private Demo id; 

  private String name; 

  public Test() { 
  } 

  public int getId() { 
    return id.getId(); 
  } 

  @Column(name = "firstname") 
  public String getFirstName(){ 
    return id.getFirstName() 
  } 

  @Column(name = "lastname") 
  public String getLastName(){ 
    return id.getLastName() 
  } 

  @Column(name = "name") 
  public String getName() { 
    return name; 
  } 

  public void setName(String name) { 
    this.name = name; 
  } 


方法2:  

(3)不想在Demo中定义列名,可以用以下方法,用于公共复合主键 
通过@AttributeOverride注释来指定Test类的firstName,lastName与数据库中表的first_name,last_name进行映射. 
以下代码在class Test 
@EmbeddedId 
@AttributeOverrides( { 
@AttributeOverride(name = firstName, column = @Column(name = first_name)), 
@AttributeOverride(name = lastName, column = @Column(name = last_name)) }) 

不需要getFirstName,getLastName ,希望能给你带来帮助


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是一个简单的例子: 假设我们有一个学生信息表,表结构如下: ```sql CREATE TABLE student ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, gender TINYINT NOT NULL, age INT NOT NULL, PRIMARY KEY (id) ); ``` 我们可以通过以下实体类来映射这个表: ```java @Entity @Table(name = "student") public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "gender") private Integer gender; @Column(name = "age") private Integer age; // getters and setters } ``` - `@Entity` 注解表示这是一个实体类,需要被 JPA 管理。 - `@Table` 注解表示与之对应的表名。 - `@Id` 注解表示该字段是主键。 - `@GeneratedValue` 注解表示主键的生成策略,这里使用了 `GenerationType.IDENTITY`,表示使用自增长方式生成主键。 - `@Column` 注解表示该字段与表中的哪个列对应。 如果表中有联合主键的情况,可以使用 `@EmbeddedId` 注解。例如,我们有一个成绩表,表结构如下: ```sql CREATE TABLE score ( student_id INT NOT NULL, subject VARCHAR(50) NOT NULL, score INT NOT NULL, PRIMARY KEY (student_id, subject) ); ``` 我们可以通过以下实体类来映射这个表: ```java @Entity @Table(name = "score") public class Score { @EmbeddedId private ScoreKey id; @Column(name = "score") private Integer score; // getters and setters } @Embeddable public class ScoreKey implements Serializable { @Column(name = "student_id") private Long studentId; @Column(name = "subject") private String subject; // equals and hashCode } ``` - `@Embeddable` 注解表示这是一个嵌入式对象。 - 嵌入式对象 `ScoreKey` 作为主键,需要使用 `@EmbeddedId` 注解。 - 嵌入式对象中的字段需要使用 `@Column` 注解指定对应的列名。 以上代码只是一个简单的例子,实际使用时可能需要更多的注解和配置,具体可以根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值