JPA(Java Persistence API)学习总结

来源:互联网 发布:python界面开发html5 编辑:程序博客网 时间:2024/05/21 16:22

具有ORM元数据的领域对象称为实体(Entity),按JPA的规范,实体具备以下的条件:

  • 必须使用javax.persistence.Entity注解或者在XML映射文件中有对应的元素;
  • 必须具有一个不带参的构造函数,类不能声明为final,方法和需要持久化的属性也不能声明为final;
  • 如果游离状的实体对象需要以值的方式进行传递,如通Session bean的远程业务接口传递,则必须实现Serializable接口;
  • 需要持久化的属性,其访问修饰符不能是public,它们必须通过实体类方法进行访问。
  • @Entity:将领域对象标注为一个实体,表示需要保存到数据库中,默认情况下类名即为表名,通过name属性显式指定表名,如①处的name = "T_TOPIC",表示Topic保存到T_TOPIC表中;
  • @Id :对应的属性是表的主键,如②-1所示;
  • @GeneratedValue:主键的产生策略,通过strategy属性指定。默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略,如SqlServer对应identity,MySql对应auto increment。在javax.persistence.GenerationType中定义了以下几种可供选择的策略:
    • IDENTITY:表自增键字段,Oracle不支持这种方式;
    • AUTO: JPA自动选择合适的策略,是默认选项;
    • SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;
    • TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。不同的JPA实现商生成的表名是不同的,如OpenJPA生成openjpa_sequence_table表Hibernate生成一个hibernate_sequences表,而TopLink则生成sequence表。这些表都具有一个序列名和对应值两个字段,如SEQ_NAME和SEQ_COUNT。
  • @Column(name = "TOPIC_ID"):属性对应的表字段。我们并不需要指定表字段的类型,因为JPA会根据反射从实体属性中获取类型;如果是字符串类型,我们可以指定字段长度,以便可以自动生成DDL语句,如③处所示;
  • @Temporal(TemporalType.DATE):如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型。在javax.persistence.TemporalType枚举中定义了3种时间类型:
    • DATE :等于java.sql.Date
    • TIME :等于java.sql.Time
    • TIMESTAMP :等于java.sql.Timestamp

对于继承的实体,在javax.persistence.InheritanceType定义了3种映射策略,:

  • SINGLE_TABLE:父子类都保存到同一个表中,通过字段值进行区分。这是我们Topic实体所采用的策略,Topic和PollTopic都保存到同一张表中,通过TOPIC_TYPE字段进行区分,Topic在T_TOPIC表中对应TOPIC_TYPE=1的记录,而PollTopic对应 TOPIC_TYPE=2的记录(稍后在PollTopic实体中指定);区别的字段通过@DiscriminatorColumn说明,区分字段对应该实体的值通过@DiscriminatorValue指定;
  • JOINED:父子类相同的部分保存在同一个表中,不同的部分分开存放,通过表连接获取完整数据;
  • TABLE_PER_CLASS:每一个类对应自己的表,一般不推荐采用这种方式。

 

 

原创粉丝点击