Pro JPA2读书笔记系列(十一)-第十章(高级对象-关系映射)

Pro JPA2 第十章(高级对象-关系映射)

  • 10.1 表和列名
    在前面的章节中,已经显示了表和列的名称位大写标识符,这么做的理由是:首先,这有助于将它们与Java标识符区分开来;其次,因为SQL标准定义了未分割的数据库标识符不区分大小写,而往往以大写形式来表示.
    每当指定或者默认表和列名时,将完全把指定或默认的标识符字符串传递给JDBC驱动程序.

    @Table(name="employee")
    @Table(name="Employee")
    @Table(name="EMPLOYEE")
    

    上述三个写法都在数据库中显示为同一个表.
    如果有些数据库的名称打算区分大小写,那么必须显式地分割.分割的方法是使用必须进行转义的第二组双引号来围绕该标识符.

    @Table(name="\"Employee\"")
    @Table(name="\"EMPLOYEE\"")

    当使用XML映射文件时,标识符也是通过在标识符名称中包括引号来分割.

    <column name=""ID"" />
    <column name=""Id"" />
  • 10.2 复杂的嵌入对象

    • 10.2.1 高级嵌入映射
      嵌入对象可以嵌入其他的对象,具有基本类型或可嵌入类型的元素集合,以及与实体存在关系.在这个假设直下,嵌入在其他嵌入对象中的对象仍然依赖于所嵌入的实体,是完全可能的.

      @Embeddable
      @Access(AccessType.FIELD)
      public class ContactInfo {
             
      @Embedded
      private Address residence;
      
      @ManyToOne
      @JoinColumn(name="PRI_NUM")
      private Phone primaryPhone;
      
      @ManyToMany 
      @MapKey(name="type")
      @JoinTable(name="EMP_PHONES")
      private Map phones;
      }
      
      @Entity
      public class Phone {
             
          @Id
          String num;
          @ManyToMany(mappedBy="contactInfo.phones")
          List employees;
      
          String type;
      }
    • 10.2.2 重写嵌入关系

      @Entity
      public class Customer {
             
          @Id
          int id;
      
          @Embedded
          @AttributeOverride(name="address.zip",column=@Column(name="ZIP"))
          @AssociationOverrides({
              @AssociationOverride(name="primaryPhone",joinColumns=@JoinColumn(name="EMERG_PHONE")),
              @AssociationOverride(name="phones",joinTable=@JoinTable(name="CUST_PHONE"))
          })
          private ContactInfo contactInfo;
      }
  • 10.3 复合主键
    在某些情况下,实体的主键或标识符必须由多个字段组成,或者从数据库的角度来看,表中的主键是由多个列组成.
    取决于我们所希望的实体类的结构,存在两个选项可用于在实体中拥有复合主键.它们都要求使用一个单独的类来包含主键字段,成为主键类(primary key class).主键类必须包含equals()和hashCode()方法定义,以便能够由持久化提供程序存储和作为键.它们还必须是公共的,实现了Serializable,以及拥有一个无参构造函数.

    • 10.3.1 id类
      第一个也是最基本的主键类类型是id类(id class). 使用@Id注解来标记组成实体主键的每个字段.通过在实体类定义中使用@IdClass注解来单独定义主键类,并且使其与实体相关联.

      @Entity
      @IdClass(EmployeeId.class)
      public class Employee {
             
          @Id
          private String country;
          @Id
          @Column(name="EMP_ID")
          private int id;
          private String name;
          private long salary;
      }

      主键类必须包含在名称和类型方面均匹配实体中主键特性的字段或属性.

      public class EmployeeId implements Serializable {
             
          private String country;
          private int id;
          public EmployeeId(){}
          public EmployeeId(String country,int id) {
              this.country = country;
              this.id = id;               
          }
      
          public String getCountry() { return country; }
          public int getId() { return id; }
      
          public boolean equals(Object o) {
              return ((o instanceof EmployeeId) && country.equals(((EmployeeId)o).getCountry())&& id == ((EmployeeId)o).getId());
          }
      
          public int hashCode(){
              return country.hashCode() + id;
          }
      }

你可能感兴趣的:(java,读书笔记,jpa)