EJB3中的嵌入式对象继承

时间:2011-12-02 11:47:09

标签: ejb-3.0 eclipselink

我正在使用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工作正常!所以我又回到了不理解状态......

有人知道如何在层次结构中使用可嵌入实体吗?这甚至是问题???

1 个答案:

答案 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。