Objectify能否支持嵌入实体等相同类型的嵌入式实体?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Objectify能否支持嵌入实体等相同类型的嵌入式实体?相关的知识,希望对你有一定的参考价值。

根据Objectify文档,支持嵌入式实体:

当你嵌入一个本身就是@Entity的类时有一个特例:

@Entity
class Person {
    @Id Long id;
}

@Entity
class Car {
    @Id Long id;
    Person person;
} 

这将将Person实体嵌入Car实体中。

但是,在尝试使用Category-SubCategory(类型为Category)关系注册以下类时:

@Entity
class Ctegory{
    @Id String name;
    Category subCategory;
}

ObjectifyService.register(Category.class);

我得到StackOverflowError异常:

 java.lang.StackOverflowError
    at java.lang.invoke.MemberName.isGetter(Unknown Source)
    at java.lang.invoke.MemberName.getMethodOrFieldType(Unknown Source)
    at java.lang.invoke.DirectMethodHandle.make(Unknown Source)
    at java.lang.invoke.DirectMethodHandle.make(Unknown Source)
    at java.lang.invoke.MethodHandles$Lookup.getDirectFieldCommon(Unknown Source)
    at java.lang.invoke.MethodHandles$Lookup.getDirectFieldNoSecurityManager(Unknown Source)
    at java.lang.invoke.MethodHandles$Lookup.unreflectField(Unknown Source)
    at java.lang.invoke.MethodHandles$Lookup.unreflectGetter(Unknown Source)
    at com.googlecode.objectify.impl.FieldProperty.<init>(FieldProperty.java:41)
    at com.googlecode.objectify.impl.KeyMetadata.findKeyFields(KeyMetadata.java:77)
    at com.googlecode.objectify.impl.KeyMetadata.<init>(KeyMetadata.java:50)
    at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.createEntityClassTranslator(ClassTranslatorFactory.java:64)
    at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.create(ClassTranslatorFactory.java:49)
    at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.create(ClassTranslatorFactory.java:36)
    at com.googlecode.objectify.impl.translate.Translators.create(Translators.java:138)
    at com.googlecode.objectify.impl.translate.Translators.get(Translators.java:117)
    at com.googlecode.objectify.impl.translate.CreateContext.getTranslator(CreateContext.java:27)
    at com.googlecode.objectify.impl.translate.ClassPopulator.<init>(ClassPopulator.java:88)
    at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.createEntityClassTranslator(ClassTranslatorFactory.java:66)

所以我的理论是,这种“递归”关系不受支持,尽管它是一个有效的常见用例。

这是真的吗?还是我想念这里的东西?

答案

根据官方Github Objectify存储库中的an issue,这种“递归”关系是一个进步的增强,因此,现在,它是不可能的。

以上是关于Objectify能否支持嵌入实体等相同类型的嵌入式实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL 查询配置 jOOQ 可嵌入类型

Symfony2 - 验证不适用于嵌入式表单类型

嵌入式Linux C语言——指针

基于图嵌入的兵棋联合作战态势实体知识表示学习方法

嵌入 D(编程语言)

使用 objectify 在实体中搜索子字符串