jpa 应注意的问题

  • 关于主键id,我们现在使用mysql数据库提供的自增字段,需要在id定义中制定<generated-value strategy="IDENTITY" />

对于"TABLE"strategy,虽然可以通过genarator来区分多个table的sequence值,但建议还是用数据库本身支持的自增方式更为稳妥,如果以后更换DBMS,只需要把orm的xml文件中的"IDENTITY"批量替换即可支持。

  • 通常情况下,|为了有效的利用索引,|所有字段使用|@column的||nullable 属性指定为非空,除非的确存在不知取值的情况,如end_time这种属性,没有end之前应该是null。
  • 对于字段名的定义,不应该拘泥于model的属性名,在某些情况修改属性名达到清楚的映射关系。举例说明:model中有时为了说明 对象包含关系,常常使用类似owner或者某个确定的subclass作为属性名,而在数据库映射的时候这样的子类有可能使用不存在实体表,这样在数据库 中使用owner_id或者<某种子类的名称>_id是比较混淆的。
  • 对于需要序列化保存的数据,统一用"ENBEDDED_"开头,以清晰标明,这些数据的拼装、解析、序列化和反序列化工作都不在该blob字段的对应属性的相关get/set方法上做,而是另外写PrePersist/PostLoad方法,在方法里实现
  • 数据库schema的field定义本身不设置default值,需要的话entity的initial方法里实现。
  • 类型为Enum的属性,使用|@Enumerated(STRING),而不是ORDINAL,ORDINAL值必须从0开始,而且 严格按照Enum定义的先后顺序来排,如果String的顺序有一天改变了,会导致历史数据的不正确。使用@Enumerated(STRING)可以避 免这个问题,同时该字段使用Column的|columnDefinition来指定ddl,mysql本身有enum数据类型,这个||数据||类型在 存储上是使用数值的,只是展现成string,并且使用enum字段可以避免非法数据的插入。
  • 对于account这种对同步一致性敏感的实体,一律加上version属性/字段,并用@Version标识
  • OpenJPA在一个table中不允许定义两个unique column,因为它会把unique index定义成 unq_(column_name),如果定义两个以上的话,会导致索引名重复。
  • 对于时间类型的属性,映射时:

    DATE 对应mysql的DATE类型
    TIME 对应mysql的TIME类型
    TIMESTAMP 对应mysql的DATETIME类型

  • OneToOne、ManyToOne中用Optional=false表示字段非空
  • persistence继承关系的entity时,对于父子类共同属性比较多,子类扩展比较少的情况,通常使用sigle-table策略,注意:

    * discriminator-column统一定义成DTYPE,类型为字符串,长度为2~4,基本为该类名的首字母,如:
      <discriminator-column name="DTYPE" discriminator-type="STRING" length="2"
    * 父类属性的列名前不加前缀,定义成非空* 子类中扩展的属性,对应的column名由本子类的discriminator-value加上下划线"_"开头以和父类属性和其他子类属性区别,该类字段定义为可空
      对于abstract class不能定义discriminator-value,会报错
      对于各子类间基本没有太大属性上的共通点,而且基本没有需要汇总查询的需求,
      通常使用table-per-class策略,注意:abstract class不会有相应的表存在
      对于介于以上两种之间的情况,父类属性较多,同时某些或者全部子类的属性扩展
      比较多的情况,考虑汇总查询操作的开销,可以采用join-table的策略

 

1)可以通过Spring配置多個文件來引用不同的Persistence.xml,而應用可以根據需要使用不同的Spring配置文件從而來決定使用ResourceLocal還是Resource JTA.
2)建議使用OpenJPA的工具生成SQL,然后對不同的數據庫的相關特性修改這些SQL,作为部署时的脚本。
3)Persistence.xml里打包到Library里面沒有問題,因為可以通過Spring來決定到底是用哪一個Persistence.xml,這樣做對Library來說更完整更有獨立性。
4)可以用Spring注入EntityManager,沒有在Library里顯式的創建EntityManager;或者更应该注入 EntityManagerFactory;通過聲明式的事務管理來決定事務的范圍。在J2SE的環境里也可以用Spring進行單元測試。
5)可以用Spring来配置事务管理,支持事务的嵌套。因此即使在API内配置了事务,如果外部应用配置了事务那么API配置的事务会自动被屏蔽。我们可以在API里不配置任何事务,在API里配置事务可以使单元测试更方便。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值