Встроенное наследование объектов в EJB3 - PullRequest
3 голосов
/ 02 декабря 2011

Я разрабатываю систему пользователя / пароля с 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)])

2-я часть:

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 не распознается как сущность.Но если я использую класс Password, все работает нормально!Итак, я вернулся к состоянию непонимания ...

Кто-нибудь знает, как использовать встраиваемые объекты в иерархии?Это даже проблема ???

1 Ответ

2 голосов
/ 02 декабря 2011

В спецификации ничего не говорится о наследовании встраиваемых объектов, поэтому похоже, что оно не поддерживается. Вероятно, из-за простоты в качестве цели.

Конечно, некоторые реализации могут иметь это. К сожалению, Hibernate не является одним из них: https://hibernate.onjira.com/browse/HHH-1910 Eclipselink поддерживает, но не через аннотацию или XML-дескриптор: http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Inheritance

Кстати, вопрос помечен как спящий, но вы используете EclipseLink.

...