有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用嵌入式嵌套类表示JPA中的复杂状态

我试图使用一个内部类作为可嵌入类来表示外部类的一些复杂属性。当我存储它时,eclipselink生成的数据库模式中没有来自内部类的信息

我想做的是个好主意吗?为什么eclipselink似乎无法识别AttributesgetRate()@Basic属性

其他一些信息:Measure必须使用提供给Person的构造函数的工厂进行实例化,所以我甚至不知道如何使用它。似乎越来越有可能我必须创建一个单独的类来存储简单的Person状态(比如double,而不是Measures),并使用它们来创建真正的Person类型的对象,但这对我的应用程序的其余部分有着非常糟糕的影响

  @Entity
  public static class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Transient
    public Measure<Double, CleanupRate> rate;
    @Embedded
    private Attributes attributes;

    @Embeddable
    public static class Attributes {

      @Transient
      private Person person;

      public Attributes() {

      }

      public Attributes(Person person) {
        this.person = person;
      }

      @Basic
      public double getRate() {
        return person.rate.getInternalValue();
      }

      public void setRate(double value) {
        person.rate.setInternalValue(value);
      }
    }

    public Person() {
      rate = udm.getMeasureFactory().createMeasure(0.0, CleanupRate.class);
      attributes = new Attributes(this);
    }

    public void setRate(double rate) {
      this.rate.setValue(rate);
    }
  }

编辑:

为了在从存储中检索对象时将度量依赖项注入到对象中,我添加了一个接口,该接口注入依赖项并在DAO中使用。因为可以注入DAO,所以我可以将依赖关系传播到检索到的对象。我是从a那里得到这个主意的

  private <T extends UomInjectable> List<T> //
          getListOfUomInjectableType(final Class<T> klass) {
    List<T> result = getListOfType(klass);
    for (UomInjectable injectable : result) {
      injectable.injectUomFactory(udm);
    }
    return result;
  }

共 (3) 个答案

  1. # 2 楼答案

    它使用的是Person类中的访问类型(设置为field),因此在属性级别看不到注释

    您需要使用可嵌入类上的access(PROPERTY)更改访问类型,并且应该删除person属性上的@Transient注释

  2. # 3 楼答案

    我认为,一般来说,如果实体(可嵌入或其他)需要带参数的构造函数,就会遇到麻烦。我不确定这与您的模式生成问题有什么关系,但我认为在尝试持久化/检索这些对象时会出现问题

    正如您所暗示的,JPA要求所有实体类型都有一个无参数构造函数。虽然您的Attributes类有一个,但它会将“person”字段保留为null,这将相当快地导致NPE。person构造函数也是如此(可能您遗漏了从示例代码中传入“udm”的构造函数?)