持久化API(JPA)系列(八)实体关系映射(ORM)之单表映射@EmbeddedId

本文将介绍《联合主键:使用@EmbeddedId嵌入外部主键》

上文是通过@IdClass引用外部主键,联合主键也可以采用嵌入式主键替代。


1)新建外部主键类Family2.java

设置联合主键man和woman,因此外部主键也需要定义两个相同的变量,并添加一个以两个变量为输入的构造函数,同时添加getter/setter函数。

主键类必须满足:

1.必须实现Serializable接口,必须有默认的public无参数的构造方法

2.必须覆盖equals和hashCode方法,这些要求与使用复合主键的要求相同。

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

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tgb.itoo.exam.entity;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.persistence.Embeddable;  
  6.   
  7. @SuppressWarnings("serial")  
  8. @Embeddable  
  9. public class Family2PK implements Serializable {  
  10.   
  11.     private String man;//丈夫  
  12.     private String woman;//妻子  
  13.   
  14.     public Family2PK() {  
  15.   
  16.     }  
  17.   
  18.     public Family2PK(String man, String woman) {          
  19.         this.man = man;  
  20.         this.woman = woman;  
  21.     }  
  22.   
  23.     ....//同Family.java中的函数    
  24. }  

2)使用@EmbeddedId在试题Bean类Family2.java中嵌入外部主键

通过注释符来设定与表、字段的映射关系。

该类有如下特点:

1.映射的表名为family2.java,目的是与上文Demo中family.java区分

2.通过@EmbeddedId标签嵌入了外部主键Family2PK的实例id,表示被嵌入的主键变量

3.并分别添加一个无参和有参的构造函数,来常见id的实例。

4.在getMan()、setMan()、getWoman()、setWoman()函数中,分别引用id的值。

  

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tgb.itoo.exam.entity;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.persistence.Column;  
  6. import javax.persistence.EmbeddedId;  
  7. import javax.persistence.Entity;  
  8. import javax.persistence.Id;  
  9. import javax.persistence.IdClass;  
  10. import javax.persistence.Table;  
  11.   
  12. @SuppressWarnings("serial")  
  13. @Entity  
  14. @Table(name="family2")  
  15. public class Family2 implements Serializable {  
  16.   
  17.     @EmbeddedId  
  18.     private Family2PK id;//嵌入式主键      
  19.   
  20.     private String address;// 地址  
  21.   
  22.     //初始化  
  23.     public Family2() {    
  24.         this.id=new Family2PK();  
  25.     }  
  26.       
  27.     public Family2(String man,String woman) {  
  28.         this.id=new Family2PK(man,woman);  
  29.     }  
  30.           
  31.     @Column(name="man")  
  32.     public String getMan() {  
  33.         return this.id.getMan();  
  34.     }  
  35.   
  36.     public void setMan(String man) {  
  37.         this.id.setMan(man);  
  38.     }  
  39.   
  40.     @Column(name="woman")  
  41.     public String getWoman() {  
  42.         return this.id.getWoman();  
  43.     }  
  44.   
  45.     public void setWoman(String woman) {  
  46.         this.id.setWoman(woman);  
  47.     }  
  48.   
  49.     @Column(name="address" ,length=100)  
  50.     public String getAddress() {  
  51.         return address;  
  52.     }  
  53.   
  54.     public void setAddress(String address) {  
  55.         this.address = address;  
  56.     }  
  57.   
  58. }  

3)新建远程接口类Family2DAORemote.java

定义两个接口:新增、根据主键查询

同上文:FamilyDAORemote.java

4)开发实现类Family2DAO.java

1.首先构造一个主键对象Family2PK
2.后调用find()方法根据该主键对象进行查询

同上文:FamilyDAO.java

 5)测试:客户端调用

同上文:Family2DAOClient.java

============================================================================

总结

      通过两个Demo可以看出,使用@IdClass指定外部主键和使用@EmbeddedId嵌入外部主键,的主要区别在于两个文件:FamilyPK.java主键类和Family.java,接下来通过截图对比一下吧:


Files contained in javax.persistence.jar: META-INF/MANIFEST.MF javax.persistence.Access.class javax.persistence.AccessType.class javax.persistence.AssociationOverride.class javax.persistence.AssociationOverrides.class javax.persistence.AttributeOverride.class javax.persistence.AttributeOverrides.class javax.persistence.Basic.class javax.persistence.Cache.class javax.persistence.Cacheable.class javax.persistence.CacheRetrieveMode.class javax.persistence.CacheStoreMode.class javax.persistence.CascadeType.class javax.persistence.CollectionTable.class javax.persistence.Column.class javax.persistence.ColumnResult.class javax.persistence.criteria.AbstractQuery.class javax.persistence.criteria.CollectionJoin.class javax.persistence.criteria.CompoundSelection.class javax.persistence.criteria.CriteriaBuilder.class javax.persistence.criteria.CriteriaQuery.class javax.persistence.criteria.Expression.class javax.persistence.criteria.Fetch.class javax.persistence.criteria.FetchParent.class javax.persistence.criteria.From.class javax.persistence.criteria.Join.class javax.persistence.criteria.JoinType.class javax.persistence.criteria.ListJoin.class javax.persistence.criteria.MapJoin.class javax.persistence.criteria.Order.class javax.persistence.criteria.ParameterExpression.class javax.persistence.criteria.Path.class javax.persistence.criteria.PluralJoin.class javax.persistence.criteria.Predicate.class javax.persistence.criteria.Root.class javax.persistence.criteria.Selection.class javax.persistence.criteria.SetJoin.class javax.persistence.criteria.Subquery.class javax.persistence.DiscriminatorColumn.class javax.persistence.DiscriminatorType.class javax.persistence.DiscriminatorValue.class javax.persistence.ElementCollection.class javax.persistence.Embeddable.class javax.persistence.Embedded.class javax.persistence.EmbeddedId.class javax.persistence.Entity.class javax.persistence.EntityExistsException.class javax.persistence.EntityListeners.class javax.persistence.EntityManager.c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值