JPA Advanced Mappings(映射)

来源:互联网 发布:组成数据的基本单位 编辑:程序博客网 时间:2024/06/06 03:49

JPA Advanced Mappings(映射)

JPA是一个使用java规范发布的库。因此,它支持所有面向对象的实体持久性概念。

原文链接:http://blogxinxiucan.sh1.newtouch.com/2017/07/30/JPA-Advanced-Mappings-映射/

继承策略

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

Staff, TeachingStaff, NonTeachingStaff关系:

在上图中,Staff是一个实体,TeachingStaff和NonTeachingStaff是员工的子实体。在这里我们将讨论上述三个继承的策略。

单表策略

单表策略采用所有类字段(超类和子类),并将其映射到称为SINGLE_TABLE策略的单个表中。鉴别器值在区分一个表中三个实体的值时起关键作用。

让我们考虑上面的例子,TeachingStaff和NonTeachingStaff是类员工的子类。提醒继承的概念(是通过子类继承超类的属性的机制),因此sid,sname是属于TeachingStaff和NonTeachingStaff的字段。创建一个JPA项目。本项目的所有模块如下:

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

package com.tutorialspoint.eclipselink.entity;import java.io.Serializable;import javax.persistence.DiscriminatorColumn;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Inheritance;import javax.persistence.InheritanceType;import javax.persistence.Table;@Entity@Table@Inheritance( strategy = InheritanceType.SINGLE_TABLE )@DiscriminatorColumn( name = "type" )public class Staff implements Serializable {   @Id   @GeneratedValue( strategy = GenerationType.AUTO )   private int sid;   private String sname;   public Staff( int sid, String sname ) {      super( );      this.sid = sid;      this.sname = sname;   }   public Staff( ) {      super( );   }   public int getSid( ) {      return sid;   }   public void setSid( int sid ) {      this.sid = sid;   }   public String getSname( ) {      return sname;   }   public void setSname( String sname ) {      this.sname = sname;   }}

在上述代码中,@DescriminatorColumn指定字段名称(type),其值显示剩余的(Teaching and NonTeachingStaff)字段。

在com.tutorialspoint.eclipselink.entity包下创建一个名为TeachingStaff.java的 Staff类的子类(class)。TeachingStaff实体类显示如下:

package com.tutorialspoint.eclipselink.entity;import javax.persistence.DiscriminatorValue;import javax.persistence.Entity;@Entity@DiscriminatorValue( value="TS" )public class TeachingStaff extends Staff {   private String qualification;   private String subjectexpertise;   public TeachingStaff( int sid, String sname,    String qualification,String subjectexpertise ) {      super( sid, sname );      this.qualification = qualification;      this.subjectexpertise = subjectexpertise;   }   public TeachingStaff( ) {      super( );   }   public String getQualification( ){      return qualification;   }   public void setQualification( String qualification ){      this.qualification = qualification;   }   public String getSubjectexpertise( ) {      return subjectexpertise;   }   public void setSubjectexpertise( String subjectexpertise ){      this.subjectexpertise = subjectexpertise;   }}

在com.tutorialspoint.eclipselink.entity包下创建一个名为NonTeachingStaff.java的 Staff类的子类(class)。NonTeachingStaff实体类显示如下:

package com.tutorialspoint.eclipselink.entity;import javax.persistence.DiscriminatorValue;import javax.persistence.Entity;@Entity@DiscriminatorValue( value = "NS" )public class NonTeachingStaff extends Staff {   private String areaexpertise;   public NonTeachingStaff( int sid, String sname, String areaexpertise ) {      super( sid, sname );      this.areaexpertise = areaexpertise;   }   public NonTeachingStaff( ) {      super( );   }   public String getAreaexpertise( ) {      return areaexpertise;   }   public void setAreaexpertise( String areaexpertise ){      this.areaexpertise = areaexpertise;   }}

persistence.xml中

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

<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">   <persistence-unit name="Eclipselink_JPA" transaction-type="RESOURCE_LOCAL">      <class>com.tutorialspoint.eclipselink.entity.Staff</class>      <class>com.tutorialspoint.eclipselink.entity.NonTeachingStaff</class>      <class>com.tutorialspoint.eclipselink.entity.TeachingStaff</class>      <properties>         <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpadb"/>         <property name="javax.persistence.jdbc.user" value="root"/>         <property name="javax.persistence.jdbc.password" value="root"/>         <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>         <property name="eclipselink.logging.level" value="FINE"/>         <property name="eclipselink.ddl-generation" value="create-tables"/>      </properties>   </persistence-unit></persistence>

Service class

服务类是业务组件的实现部分。在名为’com.tutorialspoint.eclipselink.service’的’src’包下创建一个包。

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

package com.tutorialspoint.eclipselink.service;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import com.tutorialspoint.eclipselink.entity.NonTeachingStaff;import com.tutorialspoint.eclipselink.entity.TeachingStaff;public class SaveClient {   public static void main( String[ ] args ) {      EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" );      EntityManager entitymanager = emfactory.createEntityManager( );      entitymanager.getTransaction( ).begin( );      //Teaching staff entity       TeachingStaff ts1=new TeachingStaff(1,"Gopal","MSc MEd","Maths");      TeachingStaff ts2=new TeachingStaff(2, "Manisha", "BSc BEd", "English");      //Non-Teaching Staff entity      NonTeachingStaff nts1=new NonTeachingStaff(3, "Satish", "Accounts");      NonTeachingStaff nts2=new NonTeachingStaff(4, "Krishna", "Office Admin");      //storing all entities      entitymanager.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

最后,您将获得包含所有三类字段的单表,并与名为“Type”(字段)的discriminator列不同。

加盟表策略

加入表策略是共享引用的列,其中包含唯一值以加入表并进行简单的事务。让我们考虑与上述相同的例子。

创建JPA项目。所有项目模块如下所示:

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

package com.tutorialspoint.eclipselink.entity;import java.io.Serializable;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Inheritance;import javax.persistence.InheritanceType;import javax.persistence.Table;@Entity@Table@Inheritance( strategy = InheritanceType.JOINED )public class Staff implements Serializable {   @Id   @GeneratedValue( strategy = GenerationType.AUTO )   private int sid;   private String sname;   public Staff( int sid, String sname ) {      super( );      this.sid = sid;      this.sname = sname;   }   public Staff( ) {      super( );   }   public int getSid( ) {      return sid;   }   public void setSid( int sid ) {      this.sid = sid;   }   public String getSname( ) {      return sname;   }   public void setSname( String sname ) {      this.sname = sname;   }}

在com.tutorialspoint.eclipselink.entity包下创建一个名为TeachingStaff.java的 Staff类的子类(class)。TeachingStaff实体类显示如下:

package com.tutorialspoint.eclipselink.entity;import javax.persistence.DiscriminatorValue;import javax.persistence.Entity;@Entity@PrimaryKeyJoinColumn(referencedColumnName="sid")public class TeachingStaff extends Staff {   private String qualification;   private String subjectexpertise;   public TeachingStaff( int sid, String sname,    String qualification,String subjectexpertise ) {      super( sid, sname );      this.qualification = qualification;      this.subjectexpertise = subjectexpertise;   }   public TeachingStaff( ) {      super( );   }   public String getQualification( ){      return qualification;   }   public void setQualification( String qualification ){      this.qualification = qualification;   }   public String getSubjectexpertise( ) {      return subjectexpertise;   }   public void setSubjectexpertise( String subjectexpertise ){      this.subjectexpertise = subjectexpertise;   }}

在com.tutorialspoint.eclipselink.entity包下创建一个名为NonTeachingStaff.java的 Staff类的子类(class)。NonTeachingStaff实体类显示如下:

package com.tutorialspoint.eclipselink.entity;import javax.persistence.DiscriminatorValue;import javax.persistence.Entity;@Entity@PrimaryKeyJoinColumn(referencedColumnName="sid")public class NonTeachingStaff extends Staff {   private String areaexpertise;   public NonTeachingStaff( int sid, String sname, String areaexpertise ) {      super( sid, sname );      this.areaexpertise = areaexpertise;   }   public NonTeachingStaff( ) {      super( );   }   public String getAreaexpertise( ) {      return areaexpertise;   }   public void setAreaexpertise( String areaexpertise ) {      this.areaexpertise = areaexpertise;   }}

persistence.xml中

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

<?xml version = "1.0" encoding = "UTF-8"?><persistence version = "2.0" xmlns = "http://java.sun.com/xml/ns/persistence"    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation = "http://java.sun.com/xml/ns/persistence    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">   <persistence-unit name = "Eclipselink_JPA" transaction-type = "RESOURCE_LOCAL">      <class>com.tutorialspoint.eclipselink.entity.Staff</class>      <class>com.tutorialspoint.eclipselink.entity.NonTeachingStaff</class>      <class>com.tutorialspoint.eclipselink.entity.TeachingStaff</class>      <properties>         <property name = "javax.persistence.jdbc.url" value = "jdbc:mysql://localhost:3306/jpadb"/>         <property name = "javax.persistence.jdbc.user" value = "root"/>         <property name = "javax.persistence.jdbc.password" value = "root"/>         <property name = "javax.persistence.jdbc.driver" value = "com.mysql.jdbc.Driver"/>         <property name = "eclipselink.logging.level" value = "FINE"/>         <property name = "eclipselink.ddl-generation" value = "create-tables"/>      </properties>   </persistence-unit></persistence>

服务类

服务类是业务组件的实现部分。在名为’com.tutorialspoint.eclipselink.service’的’src’包下创建一个包。

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

package com.tutorialspoint.eclipselink.service;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import com.tutorialspoint.eclipselink.entity.NonTeachingStaff;import com.tutorialspoint.eclipselink.entity.TeachingStaff;public class SaveClient {   public static void main( String[ ] args ) {      EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" );      EntityManager entitymanager = emfactory.createEntityManager( );      entitymanager.getTransaction( ).begin( );      //Teaching staff entity       TeachingStaff ts1 = new TeachingStaff(1,"Gopal","MSc MEd","Maths");      TeachingStaff ts2 = new TeachingStaff(2, "Manisha", "BSc BEd", "English");      //Non-Teaching Staff entity      NonTeachingStaff nts1 = new NonTeachingStaff(3, "Satish", "Accounts");      NonTeachingStaff nts2 = new NonTeachingStaff(4, "Krishna", "Office Admin");      //storing all entities      entitymanager.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是外键(参考字段表单staff表)NonTeachingStaff表的结果如表格所示:

Sid Areaexpertise 3 Accounts 4 Office Admin

最后,这三个表分别使用它们的字段创建,SID字段由所有三个表共享。在员工表SID中是主键,在剩余的(TeachingStaff和NonTeachingStaff)表中SID是外键。

每个类策略表

每个类策略的表是为每个子实体创建一个表。工作人员表将被创建,但它将包含空记录。Staff表的字段值必须由TeachingStaff和NonTeachingStaff表共享。

让我们考虑与上述相同的例子。本项目的所有模块如下所示:

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

package com.tutorialspoint.eclipselink.entity;import java.io.Serializable;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Inheritance;import javax.persistence.InheritanceType;import javax.persistence.Table;@Entity@Table@Inheritance( strategy = InheritanceType.TABLE_PER_CLASS )public class Staff implements Serializable {   @Id   @GeneratedValue( strategy = GenerationType.AUTO )   private int sid;   private String sname;   public Staff( int sid, String sname ) {      super( );      this.sid = sid;      this.sname = sname;   }   public Staff( ) {      super( );   }   public int getSid( ) {      return sid;   }   public void setSid( int sid ) {      this.sid = sid;   }   public String getSname( ) {      return sname;   }   public void setSname( String sname ) {      this.sname = sname;   }}

在com.tutorialspoint.eclipselink.entity包下创建一个名为TeachingStaff.java的 Staff类的子类(class)。TeachingStaff实体类显示如下:

package com.tutorialspoint.eclipselink.entity;import javax.persistence.DiscriminatorValue;import javax.persistence.Entity;@Entitypublic class TeachingStaff extends Staff {   private String qualification;   private String subjectexpertise;   public TeachingStaff( int sid, String sname, String qualification, String subjectexpertise ) {      super( sid, sname );      this.qualification = qualification;      this.subjectexpertise = subjectexpertise;   }   public TeachingStaff( ) {      super( );   }   public String getQualification( ){      return qualification;   }   public void setQualification( String qualification ) {      this.qualification = qualification;   }   public String getSubjectexpertise( ) {      return subjectexpertise;   }   public void setSubjectexpertise( String subjectexpertise ){      this.subjectexpertise = subjectexpertise;   }}

在com.tutorialspoint.eclipselink.entity包下创建一个名为NonTeachingStaff.java的 Staff类的子类(class)。NonTeachingStaff实体类显示如下:

package com.tutorialspoint.eclipselink.entity;import javax.persistence.DiscriminatorValue;import javax.persistence.Entity;@Entitypublic class NonTeachingStaff extends Staff {   private String areaexpertise;   public NonTeachingStaff( int sid, String sname, String areaexpertise ) {      super( sid, sname );      this.areaexpertise = areaexpertise;   }   public NonTeachingStaff( ) {      super( );   }   public String getAreaexpertise( ) {      return areaexpertise;   }   public void setAreaexpertise( String areaexpertise ) {      this.areaexpertise = areaexpertise;   }}

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

<?xml version="1.0" encoding = "UTF-8"?><persistence version = "2.0" xmlns = "http://java.sun.com/xml/ns/persistence"   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation = "http://java.sun.com/xml/ns/persistence    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">   <persistence-unit name = "Eclipselink_JPA" transaction-type = "RESOURCE_LOCAL">      <class>com.tutorialspoint.eclipselink.entity.Staff</class>      <class>com.tutorialspoint.eclipselink.entity.NonTeachingStaff</class>      <class>com.tutorialspoint.eclipselink.entity.TeachingStaff</class>      <properties>         <property name = "javax.persistence.jdbc.url" value = "jdbc:mysql://localhost:3306/jpadb"/>         <property name = "javax.persistence.jdbc.user" value = "root"/>         <property name = "javax.persistence.jdbc.password" value = "root"/>         <property name = "javax.persistence.jdbc.driver" value = "com.mysql.jdbc.Driver"/>         <property name = "eclipselink.logging.level" value = "FINE"/>         <property name = "eclipselink.ddl-generation" value="create-tables"/>      </properties>   </persistence-unit></persistence>

服务类

服务类是业务组件的实现部分。在名为’com.tutorialspoint.eclipselink.service’的’src’包下创建一个包。

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

package com.tutorialspoint.eclipselink.service;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import com.tutorialspoint.eclipselink.entity.NonTeachingStaff;import com.tutorialspoint.eclipselink.entity.TeachingStaff;public class SaveClient {   public static void main( String[ ] args ) {      EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" );      EntityManager entitymanager = emfactory.createEntityManager( );      entitymanager.getTransaction( ).begin( );      //Teaching staff entity       TeachingStaff ts1 = new TeachingStaff(1,"Gopal","MSc MEd","Maths");      TeachingStaff ts2 = new TeachingStaff(2, "Manisha", "BSc BEd", "English");      //Non-Teaching Staff entity      NonTeachingStaff nts1 = new NonTeachingStaff(3, "Satish", "Accounts");      NonTeachingStaff nts2 = new NonTeachingStaff(4, "Krishna", "Office Admin");      //storing all entities      entitymanager.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包含员工和教学实体的领域。

NonTeachingStaff的结果如表格所示:

Sid Areaexpertise Sname 3 Accounts Satish 4 Office Admin Krishna

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


公众号:it全能程序猿