我正在使用EJB3开发用户/密码系统。
用户拥有嵌入式密码。 我有两种密码:用户定义与否。 因此我有一个超类密码及其子类GeneratedPassword。建筑确实值得商榷。
以下是“签名”:
@Entity
@NamedQueries({ //... })
@Table(name="UserAccount")
public class UserAccount implements Serializable {
@Id
@Email
private String email;
@Embedded
private Password password;
public UserAccount(String email) {
this.email = email;
this.password = new GeneratedPassword();
}
// ...
}
@Embeddable
public class Password implements Serializable {
private String encryptedPassword;
// ...
}
@Embeddable
public class GeneratedPassword extends Password {
private String tmpPassword;
// ...
}
问题是我有一个奇怪的例外(很奇怪,因为我不明白......):
Caused by: javax.persistence.EntityExistsException:
Exception Description: No subclass matches this class [class entities.user.GeneratedPassword] for this Aggregate mapping with inheritance.
Mapping: org.eclipse.persistence.mappings.AggregateObjectMapping[password]
Descriptor: RelationalDescriptor(entities.user.UserAccount --> [DatabaseTable(UserAccount)])
第二部分:
Caused by: Exception [EclipseLink-126] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: No subclass matches this class [class entities.user.GeneratedPassword] for this Aggregate mapping with inheritance.
Mapping: org.eclipse.persistence.mappings.AggregateObjectMapping[password]
Descriptor: RelationalDescriptor(entities.user.UserAccount --> [DatabaseTable(UserAccount)])
所以我从这些例外中理解的是GeneratedPassword不被识别为实体。但是,如果我使用密码类,evrything工作正常!所以我又回到了不理解状态......
有人知道如何在层次结构中使用可嵌入实体吗?这甚至是问题???
答案 0 :(得分:2)
规范没有说明嵌入式的继承,所以看起来它不受支持。可能是因为目标简单。
当然有些实现可以拥有它。不幸的是,Hibernate不是其中之一:https://hibernate.onjira.com/browse/HHH-1910 Eclipselink支持,但不支持注释或XML描述符:http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Inheritance
顺便说一句,问题用hibernate标记,但你使用EclipseLink。