3.11.1. 扩展实体

在应用程序项目中,从 com.haulmont.cuba.security.entity.User 中派生一个实体类,添加需要的属性和相应的访问方法:

  1. @Entity(name = "sales$ExtUser")
  2. @Extends(User.class)
  3. public class ExtUser extends User {
  4. @Column(name = "ADDRESS", length = 100)
  5. private String address;
  6. public String getAddress() {
  7. return address;
  8. }
  9. public void setAddress(String address) {
  10. this.address = address;
  11. }
  12. }

应使用@Entity注解指定实体的新名称。由于父实体没有定义继承策略,因此使用的是默认继承策略 SINGLE_TABLE。这意味着子实体将与父实体存储在同一个表中,并且不需要给子实体添加@Table注解。其它父实体注解(@NamePattern@Listeners等)会自动应用于子实体,并且可以在子实体中覆盖。

新实体类的一个重要元素是 @Extends 注解,它需要一个父类作为参数。它可以创建一个子实体的注册表,并强制平台机制在所有地方使用子实体来代替父实体。注册表由 ExtendedEntities 类实现,该类是一个名为 cuba_ExtendedEntitiesSpring bean,也可以通过元数据接口访问。

将新属性的本地化名称添加到 com.sample.sales.entity消息包

messages.properties

  1. ExtUser.address=Address

messages_ru.properties

  1. ExtUser.address=Адрес

在项目的persistence.xml文件中注册新实体:

  1. <class>com.sample.sales.entity.ExtUser</class>

将相应表的更新脚本添加到数据库创建和更新脚本

  1. -- add column for "address" attribute
  2. alter table SEC_USER add column ADDRESS varchar(100)
  3. ^
  4. -- add discriminator column required for entity inheritance
  5. alter table SEC_USER add column DTYPE varchar(100)
  6. ^
  7. -- set discriminator value for existing records
  8. update SEC_USER set DTYPE = 'sales$ExtUser' where DTYPE is null
  9. ^

要在界面中使用新的实体属性,请为新实体创建视图,新视图的名称与基础实体的名称保持一致。新视图应继承基础视图并定义新属性,例如:

  1. <view class="com.sample.sales.entity.ExtUser"
  2. name="user.browse"
  3. extends="user.browse">
  4. <property name="address"/>
  5. </view>

继承的视图将包含其父视图中的所有属性。如果基础视图继承 _local 视图,并且在新视图中只添加本地属性,则不需要继承视图,在这种情况下,可以省略该步骤。