mysql 高级映射_JPA高级映射

JPA是一种发布使用Java规范的库。因此,它支持所有的面向对象的概念实体,持久性。到现在为止,我们已经完成了对象关系映射的基本知识。本章将完成对象和关系单位之间的高级映射。

继承策略

继承是任何面向对象语言的核心理念,因此我们可以用实体之间的继承关系和策略。JPA支持三种类型的继承策略:SINGLE_TABLE,JOINED_TABLE和TABLE_PER_CONCRETE_CLASS。

让我们考虑一个例子。下图显示了三个等级,即Staff, TeachingStaff, and NonTeachingStaff和他们之间的关系。

f5e392c0981142cea21e14a36c8612a4.png

在上面的图中,员工是一个实体,而TeachingStaff和NonTeachingStaff是工作人员的子实体。在这里,我们将使用上面的例子来演示继承的全部三个策略。

单一表策略

单表策略采取所有类的字段(包括超级亚类),并将它们映射成称为SINGLE_TABLE策略一个表。这里的鉴别值起着区分在一个表中三个实体的值的关键作用。

让我们考虑上面的例子。TeachingStaff和NonTeachingStaff是Staff的子类。按照继承的概念,一个子类继承其超类中的属性。因此sid和sname属于TeachingStaff和NonTeachingStaff 字段。创建JPA项目。在这个项目中的所有模块,如下所示:

创建实体

创建一个名为“src”(源)在“com.yiibai.eclipselink.entity'包下。创建一个名为Staff.java新的Java类。工作人员实体类如下所示:

packagecom.yiibai.eclipselink.entity;importjava.io.Serializable;importjavax.persistence.DiscriminatorColumn;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.Inheritance;importjavax.persistence.InheritanceType;importjavax.persistence.Table;@Entity@Table@Inheritance(strategy=InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(name="type")publicclassStaffimplementsSerializable{@Id@GeneratedValue(strategy=GenerationType.AUTO)privateintsid;privateStringsname;publicStaff(intsid,Stringsname){super();this.sid=sid;this.sname=sname;}publicStaff(){super();}publicintgetSid(){returnsid;}publicvoidsetSid(intsid){this.sid=sid;}publicStringgetSname(){returnsname;}publicvoidsetSname(Stringsname){this.sname=sname;}}

在上面的代码@DescriminatorColumn指定字段名称(类型)和它的值显示剩余(Teaching和NonTeachingStaff)字段。

创建Staff类的一个子类叫TeachingStaff.java在com.yiibai.eclipselink.entity包下。TeachingStaff 实体类如下所示:

packagecom.yiibai.eclipselink.entity;importjavax.persistence.DiscriminatorValue;importjavax.persistence.Entity;@Entity@DiscriminatorValue(value="TS")publicclassTeachingStaffextendsStaff{privateStringqualification;privateStringsubjectexpertise;publicTeachingStaff(intsid,Stringsname,Stringqualification,Stringsubjectexpertise){super(sid,sname);this.qualification=qualification;this.subjectexpertise=subjectexpertise;}publicTeachingStaff(){super();}publicStringgetQualification(){returnqualification;}publicvoidsetQualification(Stringqualification){this.qualification=qualification;}publicStringgetSubjectexpertise(){returnsubjectexpertise;}publicvoidsetSubjectexpertise(Stringsubjectexpertise){this.subjectexpertise=subjectexpertise;}}

创建Staff 的一个子类(类)类叫NonTeachingStaff.java 在 com.yiibai.eclipselink.entity 包下。NonTeachingStaff实体类如下所示:

packagecom.yiibai.eclipselink.entity;importjavax.persistence.DiscriminatorValue;importjavax.persistence.Entity;@Entity@DiscriminatorValue(value="NS")publicclassNonTeachingStaffextendsStaff{privateStringareaexpertise;publicNonTeachingStaff(intsid,Stringsname,Stringareaexpertise){super(sid,sname);this.areaexpertise=areaexpertise;}publicNonTeachingStaff(){super();}publicStringgetAreaexpertise(){returnareaexpertise;}publicvoidsetAreaexpertise(Stringareaexpertise){this.areaexpertise=areaexpertise;}}

Persistence.xml

persistence.xml中包含数据库的配置信息和实体类的注册信息。 XML文件如下所示:

<?xml version="1.0"encoding="UTF-8"?>com.yiibai.eclipselink.entity.Staffcom.yiibai.eclipselink.entity.NonTeachingStaffcom.yiibai.eclipselink.entity.TeachingStaff

服务类

服务类业务组件的实现部分。创建com.yiibai.eclipselink.service“包在'src”下。

创建一个给定的包下名为SaveClient.java用来存储Staff,TeachingStaff和NonTeachingStaff类字段类。SaveClient类如下所示:

packagecom.yiibai.eclipselink.service;importjavax.persistence.EntityManager;importjavax.persistence.EntityManagerFactory;importjavax.persistence.Persistence;importcom.yiibai.eclipselink.entity.NonTeachingStaff;importcom.yiibai.eclipselink.entity.TeachingStaff;publicclassSaveClient{publicstaticvoidmain(String[]args){EntityManagerFactoryemfactory=Persistence.createEntityManagerFactory("Eclipselink_JPA");EntityManagerentitymanager=emfactory.createEntityManager();entitymanager.getTransaction().begin();//Teaching staff entityTeachingStaffts1=newTeachingStaff(1,"Gopal","MSc MEd","Maths");TeachingStaffts2=newTeachingStaff(2,"Manisha","BSc BEd","English");//Non-Teaching Staff entityNonTeachingStaffnts1=newNonTeachingStaff(3,"Satish","Accounts");NonTeachingStaffnts2=newNonTeachingStaff(4,"Krishna","Office Admin");//storing all entitiesentitymanager.persist(ts1);entitymanager.persist(ts2);entitymanager.persist(nts1);entitymanager.persist(nts2);entitymanager.getTransaction().commit();entitymanager.close();emfactory.close();}}

编译并执行上述程序后,Eclipse IDE的控制台面板上会得到通知。检查MySQL工作台的输出。以表格格式的输出如下所示:

Sid

Type

Sname

Areaexpertise

Qualification

Subjectexpertise

1

TS

Gopal

MSC MED

Maths

2

TS

Manisha

BSC BED

English

3

NS

Satish

Accounts

4

NS

Krishna

Office Admin

最后,会得到一个包含所有三个类字段鉴别列命名类型(字段)一个表。

注册策略表

连接表的策略是共享引用的列包含唯一值的加入表并进行便捷事务。让我们考虑与上述相同的例子。

创建JPA项目。所有工程的模块如下所示。

创建实体

在“src”下创建一个名为 com.yiibai.eclipselink.entity' 的包。创建一个名为Staff.java新的Java类。Staff 实体类如下所示:

packagecom.yiibai.eclipselink.entity;importjava.io.Serializable;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.Inheritance;importjavax.persistence.InheritanceType;importjavax.persistence.Table;@Entity@Table@Inheritance(strategy=InheritanceType.JOINED)publicclassStaffimplementsSerializable{@Id@GeneratedValue(strategy=GenerationType.AUTO)privateintsid;privateStringsname;publicStaff(intsid,Stringsname){super();this.sid=sid;this.sname=sname;}publicStaff(){super();}publicintgetSid(){returnsid;}publicvoidsetSid(intsid){this.sid=sid;}publicStringgetSname(){returnsname;}publicvoidsetSname(Stringsname){this.sname=sname;}}

创建Staff类的一个子类叫TeachingStaff.java在com.yiibai.eclipselink.entity包下。TeachingStaff 实体类如下所示:

packagecom.yiibai.eclipselink.entity;importjavax.persistence.DiscriminatorValue;importjavax.persistence.Entity;@Entity@PrimaryKeyJoinColumn(referencedColumnName="sid")publicclassTeachingStaffextendsStaff{privateStringqualification;privateStringsubjectexpertise;publicTeachingStaff(intsid,Stringsname,Stringqualification,Stringsubjectexpertise){super(sid,sname);this.qualification=qualification;this.subjectexpertise=subjectexpertise;}publicTeachingStaff(){super();}publicStringgetQualification(){returnqualification;}publicvoidsetQualification(Stringqualification){this.qualification=qualification;}publicStringgetSubjectexpertise(){returnsubjectexpertise;}publicvoidsetSubjectexpertise(Stringsubjectexpertise){this.subjectexpertise=subjectexpertise;}}

创建Staff的一个子类(类)类叫NonTeachingStaff.java在com.yiibai.eclipselink.entity包下。NonTeachingStaff实体类如下所示:

packagecom.yiibai.eclipselink.entity;importjavax.persistence.DiscriminatorValue;importjavax.persistence.Entity;@Entity@PrimaryKeyJoinColumn(referencedColumnName="sid")publicclassNonTeachingStaffextendsStaff{privateStringareaexpertise;publicNonTeachingStaff(intsid,Stringsname,Stringareaexpertise){super(sid,sname);this.areaexpertise=areaexpertise;}publicNonTeachingStaff(){super();}publicStringgetAreaexpertise(){returnareaexpertise;}publicvoidsetAreaexpertise(Stringareaexpertise){this.areaexpertise=areaexpertise;}}

Persistence.xml

persistence.xml文件包含数据库的配置信息和实体类的注册信息。 XML文件如下所示:

<?xml version="1.0"encoding="UTF-8"?>com.yiibai.eclipselink.entity.Staffcom.yiibai.eclipselink.entity.NonTeachingStaffcom.yiibai.eclipselink.entity.TeachingStaff

服务类

服务类业务组件的实现部分。在src下创建一个包com.yiibai.eclipselink.service“。

创建一个名为SaveClient.java给定的包来存储Staff ,TeachingStaff,NonTeachingStaff类来存储字段。然后SaveClient类如下所示:

packagecom.yiibai.eclipselink.service;importjavax.persistence.EntityManager;importjavax.persistence.EntityManagerFactory;importjavax.persistence.Persistence;importcom.yiibai.eclipselink.entity.NonTeachingStaff;importcom.yiibai.eclipselink.entity.TeachingStaff;publicclassSaveClient{publicstaticvoidmain(String[]args){EntityManagerFactoryemfactory=Persistence.createEntityManagerFactory("Eclipselink_JPA");EntityManagerentitymanager=emfactory.createEntityManager();entitymanager.getTransaction().begin();//Teaching staff entityTeachingStaffts1=newTeachingStaff(1,"Gopal","MSc MEd","Maths");TeachingStaffts2=newTeachingStaff(2,"Manisha","BSc BEd","English");//Non-Teaching Staff entityNonTeachingStaffnts1=newNonTeachingStaff(3,"Satish","Accounts");NonTeachingStaffnts2=newNonTeachingStaff(4,"Krishna","Office Admin");//storing all entitiesentitymanager.persist(ts1);entitymanager.persist(ts2);entitymanager.persist(nts1);entitymanager.persist(nts2);entitymanager.getTransaction().commit();entitymanager.close();emfactory.close();}}

编译和执行上述程序后,在Eclipse IDE的控制台面板得到通知。对于输出,检查MySQL工作台。

在这里,将创建三个表和工作人员表的结果显示在表格格式。

Sid

Dtype

Sname

1

TeachingStaff

Gopal

2

TeachingStaff

Manisha

3

NonTeachingStaff

Satish

4

NonTeachingStaff

Krishna

TeachingStaff表的结果显示如下:

Sid

Qualification

Subjectexpertise

1

MSC MED

Maths

2

BSC BED

English

在上表中的sid是外键(参考字段工作人员表单表)NonTeachingStaff 表的结果显示如下:

Sid

Areaexpertise

3

Accounts

4

Office Admin

最后,使用各自字段中创建三个表和SID字段由所有三个表共享。在员工表中,SID是主键。在剩下的两个表(TeachingStaff和NonTeachingStaff),SID是外键。

每个类表策略

表每个类策略是创建一个表中为每个子实体。 Staff表将被创建,但它会包含空值。Staff 表的字段值必须同时由TeachingStaff和NonTeachingStaff表共享。

让我们考虑与上述相同的例子。

创建实体

在src下创建一个名为“com.yiibai.eclipselink.entity'的包。创建一个名为Staff.java为一个新的Java类。Staff实体类如下所示:

packagecom.yiibai.eclipselink.entity;importjava.io.Serializable;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.Inheritance;importjavax.persistence.InheritanceType;importjavax.persistence.Table;@Entity@Table@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)publicclassStaffimplementsSerializable{@Id@GeneratedValue(strategy=GenerationType.AUTO)privateintsid;privateStringsname;publicStaff(intsid,Stringsname){super();this.sid=sid;this.sname=sname;}publicStaff(){super();}publicintgetSid(){returnsid;}publicvoidsetSid(intsid){this.sid=sid;}publicStringgetSname(){returnsname;}publicvoidsetSname(Stringsname){this.sname=sname;}}

创建Staff类的一个子类叫TeachingStaff.java 在com.yiibai.eclipselink.entity包下。该TeachingStaff实体类如下所示:

packagecom.yiibai.eclipselink.entity;importjavax.persistence.DiscriminatorValue;importjavax.persistence.Entity;@EntitypublicclassTeachingStaffextendsStaff{privateStringqualification;privateStringsubjectexpertise;publicTeachingStaff(intsid,Stringsname,Stringqualification,Stringsubjectexpertise){super(sid,sname);this.qualification=qualification;this.subjectexpertise=subjectexpertise;}publicTeachingStaff(){super();}publicStringgetQualification(){returnqualification;}publicvoidsetQualification(Stringqualification){this.qualification=qualification;}publicStringgetSubjectexpertise(){returnsubjectexpertise;}publicvoidsetSubjectexpertise(Stringsubjectexpertise){this.subjectexpertise=subjectexpertise;}}

创建Staff 的一个子类(类)类叫NonTeachingStaff.java在com.yiibai.eclipselink.entity包下。NonTeachingStaff实体类如下所示:

packagecom.yiibai.eclipselink.entity;importjavax.persistence.DiscriminatorValue;importjavax.persistence.Entity;@EntitypublicclassNonTeachingStaffextendsStaff{privateStringareaexpertise;publicNonTeachingStaff(intsid,Stringsname,Stringareaexpertise){super(sid,sname);this.areaexpertise=areaexpertise;}publicNonTeachingStaff(){super();}publicStringgetAreaexpertise(){returnareaexpertise;}publicvoidsetAreaexpertise(Stringareaexpertise){this.areaexpertise=areaexpertise;}}

Persistence.xml

persistence.xml文件中包含的实体类的数据库和注册信息的配置信息。 XML文件如下所示:

<?xml version="1.0"encoding="UTF-8"?>com.yiibai.eclipselink.entity.Staffcom.yiibai.eclipselink.entity.NonTeachingStaffcom.yiibai.eclipselink.entity.TeachingStaff

服务类

服务类业务组件的实现部分。在src下创建一个包com.yiibai.eclipselink.service“。

创建一个给定的包下名为SaveClient.java用来存储Staff,TeachingStaff和NonTeachingStaff 类字段类。该SaveClient类如下所示:

packagecom.yiibai.eclipselink.service;importjavax.persistence.EntityManager;importjavax.persistence.EntityManagerFactory;importjavax.persistence.Persistence;importcom.yiibai.eclipselink.entity.NonTeachingStaff;importcom.yiibai.eclipselink.entity.TeachingStaff;publicclassSaveClient{publicstaticvoidmain(String[]args){EntityManagerFactoryemfactory=Persistence.createEntityManagerFactory("Eclipselink_JPA");EntityManagerentitymanager=emfactory.createEntityManager();entitymanager.getTransaction().begin();//Teaching staff entityTeachingStaffts1=newTeachingStaff(1,"Gopal","MSc MEd","Maths");TeachingStaffts2=newTeachingStaff(2,"Manisha","BSc BEd","English");//Non-Teaching Staff entityNonTeachingStaffnts1=newNonTeachingStaff(3,"Satish","Accounts");NonTeachingStaffnts2=newNonTeachingStaff(4,"Krishna","Office Admin");//storing all entitiesentitymanager.persist(ts1);entitymanager.persist(ts2);entitymanager.persist(nts1);entitymanager.persist(nts2);entitymanager.getTransaction().commit();entitymanager.close();emfactory.close();}}

编译并执行上述程序后,Eclipse IDE的控制台面板上会得到通知。对于输出,检查MySQL的工作台。

这里创建了三个表并且Staff表的记录为空。

TeachingStaff的结果显示如下:

Sid

Qualification

Sname

Subjectexpertise

1

MSC MED

Gopal

Maths

2

BSC BED

Manisha

English

上表TeachingStaff包含Staff和TeachingStaff实体字段。

NonTeachingStaff的结果显示如下:

Sid

Areaexpertise

Sname

3

Accounts

Satish

4

Office Admin

Krishna

上表NonTeachingStaff包含Staff和NonTeachingStaff实体字段。

¥ 我要打赏

纠错/补充

收藏

上一篇:

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL和MySQL之间的数据类型映射如下: - INT在PostgreSQL中映射为INTEGER - VARCHAR在PostgreSQL中映射为CHARACTER VARYING - TEXT在PostgreSQL中映射为TEXT - DATE在PostgreSQL中映射为DATE - TIME在PostgreSQL中映射为TIME - TIMESTAMP在PostgreSQL中映射为TIMESTAMP - TINYINT在PostgreSQL中映射为SMALLINT - BIGINT在PostgreSQL中映射为BIGINT - FLOAT在PostgreSQL中映射为REAL - DOUBLE在PostgreSQL中映射为DOUBLE PRECISION - DECIMAL在PostgreSQL中映射为NUMERIC - TINYBLOB在PostgreSQL中映射为BYTEA - ENUM在PostgreSQL中也映射为ENUM 这些是基本的数据类型映射规则,可以根据需要进行适当的调整和映射。 另外,值得一提的是,关于面向D语言的对象关系映射(ORM)框架,有一个名为hunt-entity的框架可以用于PostgreSQL和MySQL。该框架类似于JPA学说,提供了对这两种数据库的支持。 而在MySQL中,权限映射是通过mysql库下的5个权限表进行的,这些表包括user表、db表、host表、tables_priv表和columns_priv表。这种权限映射的方式在MySQL中被认为是简单清晰的,唯一的问题是缺少了权限角色的概念。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [能不能提供一下mysql和postgresql数据类型的映射表](https://blog.csdn.net/weixin_35752645/article/details/129618496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [hunt-entity:面向D语言的对象关系映射(ORM)框架(类似于JPA学说),支持PostgreSQL和MySQL](https://download.csdn.net/download/weixin_42131013/15081349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [数据库:PostgreSQL 和 MySQL对比](https://blog.csdn.net/xishining/article/details/106232788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值