Потеря значения id (первичного ключа), хранящегося в списке от DAO до Business через EJB

Я хочу отобразить список пользователей на странице XHTML. Я отправляю запрос из моего managedBean в Бизнес через EJB (3.0), а затем еще один запрос в DAO через EJB (3.0). Я использую JPA 2 и базу данных MySQL с менеджером сущностей.

Я отправляю следующий запрос в свою базу данных

@Remote(IDaoUser.class)
@Stateless
Public class DaoUser implements IDaoUser

@PersitenceContext(unitName = "persistence_unit")
Private EntityManager em;

@Override
Public List<User> getAll() {
    Query query = em.createQuery("SELECT u FROM User u");
    List<User> users = query.getResultList();
    return users;
}

В этот момент все в порядке, и все мои пользователи попадают в мой список со всеми атрибутами, особенно id (первичный ключ). Мой пользовательский класс имеет один атрибут (дата рождения) и наследуется от родительского суперкласса (имя, имя, почта, телефон...), который снова наследует от другого класса с именем Who, у которого есть только один атрибут с именем id (первичный ключ). Затем я возвращаю свой список (пользователей) в бизнес через EJB, и, как только в бизнесе, я понимаю, что все атрибуты идентификатора равны 0. Я сохранил все остальные атрибуты (имя, имя...), кроме идентификаторов, и не могу понять почему я теряю эти ценности. Там хорошо хранятся в моем списке в DAO, но все изменилось на 0 один раз в бизнесе.

Вот мой бизнес-класс, который очень прост

@Remote(IBusinessUser.class)
@Stateless
Public class BusinessUser implements IBusinessUser

@EJB
private IDaoUser proxy;

@Override
Public List<User> getAll() {
    List<User> users = proxy.getAll();
    return users;
}

2 ответа

Учитывая описание проблемы, я бы задал несколько вопросов

  1. Являются ли сами родительские классы сущностями, то есть помечены ли они @Entity.
  2. Вы должны убедиться, что @Id находится на вашем первичном ключе. У вас есть аннотация @Id на первичном ключе.

Опыт научил меня всегда иметь атрибут @Id в классе или, по крайней мере, в родительском классе, помеченном @MappedSuperclass. И у некоторых людей все еще есть проблемы с получением их полей идентификатора из сопоставленного суперкласса.

Так что смотрите документацию JEE по использованию аннотации MappedSuperclass. Это может потребовать изменения вашей модели наследования объектов, но это не должно быть проблемой, учитывая ваши требования.

Спасибо за вашу помощь. На самом деле оба родительских класса сами являются сущностями. Мой суперкласс "Кто" - единственный, имеющий атрибут id (первичный ключ) с аннотацией @Id. Я не могу пометить свой суперкласс с помощью @MappedSuperclass, так как он связан с другим классом.

Другие вопросы по тегам