java使用嵌入式嵌套类表示JPA中的复杂状态
我试图使用一个内部类作为可嵌入类来表示外部类的一些复杂属性。当我存储它时,eclipselink生成的数据库模式中没有来自内部类的信息
我想做的是个好主意吗?为什么eclipselink似乎无法识别Attributes
中getRate()
的@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;
}
# 1 楼答案
要为属性设置Person,只需在Person中使用property access并在setAttributes方法中进行设置
看, http://en.wikibooks.org/wiki/Java_Persistence/Embeddables#Relationships
# 2 楼答案
它使用的是Person类中的访问类型(设置为field),因此在属性级别看不到注释
您需要使用可嵌入类上的access(PROPERTY)更改访问类型,并且应该删除person属性上的@Transient注释
# 3 楼答案
我认为,一般来说,如果实体(可嵌入或其他)需要带参数的构造函数,就会遇到麻烦。我不确定这与您的模式生成问题有什么关系,但我认为在尝试持久化/检索这些对象时会出现问题
正如您所暗示的,JPA要求所有实体类型都有一个无参数构造函数。虽然您的Attributes类有一个,但它会将“person”字段保留为null,这将相当快地导致NPE。person构造函数也是如此(可能您遗漏了从示例代码中传入“udm”的构造函数?)