本文将介绍《联合主键:使用@EmbeddedId嵌入外部主键》
上文是通过@IdClass引用外部主键,联合主键也可以采用嵌入式主键替代。
1)新建外部主键类Family2.java
设置联合主键man和woman,因此外部主键也需要定义两个相同的变量,并添加一个以两个变量为输入的构造函数,同时添加getter/setter函数。
主键类必须满足:
1.必须实现Serializable接口,必须有默认的public无参数的构造方法
2.必须覆盖equals和hashCode方法,这些要求与使用复合主键的要求相同。
将主键类使用@Embeddable标注,表示这是一个嵌入式类。
- package com.tgb.itoo.exam.entity;
-
- import java.io.Serializable;
-
- import javax.persistence.Embeddable;
-
- @SuppressWarnings("serial")
- @Embeddable
- public class Family2PK implements Serializable {
-
- private String man;
- private String woman;
-
- public Family2PK() {
-
- }
-
- public Family2PK(String man, String woman) {
- this.man = man;
- this.woman = woman;
- }
-
- ....
- }
2)使用@EmbeddedId在试题Bean类Family2.java中嵌入外部主键
通过注释符来设定与表、字段的映射关系。
该类有如下特点:
1.映射的表名为family2.java,目的是与上文Demo中family.java区分
2.通过@EmbeddedId标签嵌入了外部主键Family2PK的实例id,表示被嵌入的主键变量
3.并分别添加一个无参和有参的构造函数,来常见id的实例。
4.在getMan()、setMan()、getWoman()、setWoman()函数中,分别引用id的值。
- package com.tgb.itoo.exam.entity;
-
- import java.io.Serializable;
-
- import javax.persistence.Column;
- import javax.persistence.EmbeddedId;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.IdClass;
- import javax.persistence.Table;
-
- @SuppressWarnings("serial")
- @Entity
- @Table(name="family2")
- public class Family2 implements Serializable {
-
- @EmbeddedId
- private Family2PK id;
-
- private String address;
-
-
- public Family2() {
- this.id=new Family2PK();
- }
-
- public Family2(String man,String woman) {
- this.id=new Family2PK(man,woman);
- }
-
- @Column(name="man")
- public String getMan() {
- return this.id.getMan();
- }
-
- public void setMan(String man) {
- this.id.setMan(man);
- }
-
- @Column(name="woman")
- public String getWoman() {
- return this.id.getWoman();
- }
-
- public void setWoman(String woman) {
- this.id.setWoman(woman);
- }
-
- @Column(name="address" ,length=100)
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-
- }
3)新建远程接口类Family2DAORemote.java
定义两个接口:新增、根据主键查询
同上文:FamilyDAORemote.java
4)开发实现类Family2DAO.java
1.首先构造一个主键对象Family2PK
2.后调用find()方法根据该主键对象进行查询
同上文:FamilyDAO.java
5)测试:客户端调用
同上文:Family2DAOClient.java
============================================================================
总结
通过两个Demo可以看出,使用@IdClass指定外部主键和使用@EmbeddedId嵌入外部主键,的主要区别在于两个文件:FamilyPK.java主键类和Family.java,接下来通过截图对比一下吧: