ObjectDB-JPA官方文档翻译之(四):Entity数据结构的更新

英文原版:https://www.objectdb.com/java/jpa/entity/schema

持久化字段的转换

只要没有对 @Entity类型的持久化字段的定义进行更新,那么对于ObjectDB来说都是透明的。例如:添加、删除、改变构造函数,方法,和非持久化字段。
如果对持久化字段的定义做了更新,那么ObjectDB将旧的数据对象加载到内存中后,会对旧数据自动进行转换,而当再次存储时,会将其存储到新模式中,规则如下:
对于新模式中的每个字段,

  • 如果旧模式中有与其匹配的字段,则用旧值初始化新模式的相应字段
  • 如果旧模式中没有匹配的字段,则用0、null、false初始化此字段
  • 旧模式中的字段如果在新模式中没有可匹配的字段,那么直接忽略

字段的匹配规则:
对于新模式中的字段,如果旧模式中有相同名称、相同类型或者可转换类型的字段,则认为这两个字段是匹配的

可转换类型规则:

  • 所有数字类型及相关封装类型,彼此之间都可以互相转换:byte char short long float double BigInteger BigDecimal,及采用序号存储方式的枚举类型
  • 所有类型都可以转换到boolean型:0、null转换为false,其它转换为true
  • 所有类型都可以转换成字符串
  • 只包含数字的字符串 可以转换成 数字类型
  • 所有集合和数组类型都可相互转换,只要他们的元素本身的类型是可以相互转换的
  • 从一个对象 转换到 集合,只要集合本身定义的元素类型和单个对象的类型可以转换
  • 任何Map类型之间都可以相互转换,只要彼此的的键类型和值类型可以相互转换:例如从HashMap 到TreeMap
重命名(类名、包名、字段名)

重命名需要在配置信息中显示地声明这些更新。通过元素配置。

注意:在重命名或者移动类、包等此类修改数据库Schema的操作前,一定要先备份数据库,

默认配置文件包含空的元素。如果元素不是空的,则objectdb会认为schema有更新,会应用元素中的配置的信息。

<schema>
  <package name="com.example.old1" new-name="com.example.new1" />
  <package name="com.example.old2" new-name="com.example.new2">
    <class name="A" new-name="NewA" />
    <class name="B">
      <field name="f1" new-name="newF1" />
      <field name="f2" new-name="newF2" />
    class>
  package>
  <package name="com.example.old3">
    <class name="C" new-name="NewC" >
      <field name="f3" new-name="newF3" />
    class>
    <class name="C$E" new-name="NewC$E" />
  package>
schema>

需要注意的是:

  • 元素的name属性必须是非限定的(即不能包括其所在package的全路径),因为规则是当前class的package必须是其父元素package的name所指定的路径。
  • 元素的new-name属性可以是全路径的限定名(如果class从当前package移动到了另一个package),也可以是非限定的。

你可能感兴趣的:(JAVA-JPA)