繁体   English   中英

当超类不是@Entity时如何在Objectify中为超类属性建立索引

[英]How to index a super class property in Objectify when super class is not an @Entity

tl; dr:当属性是从非@Entity超级类派生时,是否可以将@Index设置为Objectify实体属性。

长版:

Java项目包含应用程序使用的抽象模型类,而不是具体对象(Objectify实体)。 对于每个这样的模型,都有一个@Entity扩展该模型并添加持久层(Objectify)的详细信息。

一个简单的例子:

public abstract class UserModel {
  protected String givenName;
}

@Entity
public class UserImpl extends UserModel {
  @Id
  private Long id;
}

之所以选择这种方法,是因为我想独立于持久层使用模型类。 因此,模型类不能包含特定于持久层的注释或代码。

我知道在Morphia(MongoDB ORM)中可以像这样注释@Entity类:

@Indexes(@Index(value = "superGivenName", fields = {@Field("givenName")}))

在Objectify中是否可以实现类似的效果? 它不一定是带有注释的解决方案。 但是应该可以将解决方案封装在@Entity类中。

注意:我将为此发布一种可能的解决方案,但我正在寻找更具风格/美感的产品,因此,如果您有更好的主意,请不要犹豫。

我认为您找不到满意的答案。 Objectify不提供任何内置的行为。

我假设您担心Objectify批注泄漏到您将广泛分发(Android或某种RPC)的客户端jar中。 我强烈建议为您的API创建单独的模型类,原因很简单,因为它将数据模型(将更改)与API分离(可能会在不同的时间表上更改)。 很难在现场升级客户。 使用单独的类,您可以使用IDE重构数据模型,而不必担心破坏向后兼容性。

如果使用http://projectlombok.org ,则数据传输对象中几乎包含零样板。

一种可能的解决方案是隐藏应在@Entity类中建立索引的超类属性。 然后使用@OnLoad和@OnSave生命周期回调在父类和子类之间传播值。

例:

public abstract class UserModel {
  protected String givenName;
}

@Entity
public class UserImpl extends UserModel {
  @Id
  private Long id;
  @Index
  private String givenName;
  @OnLoad
  void onLoad(){
      super.givenName = this.givenName;
  }
  @OnSave
  void onSave(){
      this.givenName = super.givenName;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM