Как автоматически загружать сущности с отношениями @ManyToMany в Java - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь узнать, как создать приложение Java Enterprise (в настоящее время использующее EclipseLink), там у меня есть сущность User, которая имеет отношение @ManyToMany с сущностью Card, однако, когда пользователи получаютпри загрузке из базы данных атрибут карт не заполняется автоматически, как я ожидал.

Вот мой объект User:

@Entity
@Table(name = "USR")
public class User extends Person implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "CPF", unique = true, nullable = false)
    private String cpf;

    @Column(name = "USERNAME", length = 20, nullable = false, unique = true)
    private String username;

    @Column(name = "BDAY")
    @Temporal(TemporalType.DATE)
    private Date bDay;

    @Column(name = "EMAIL", length = 100, nullable = false, unique = true)
    private String email;

    @ManyToMany
    private List<Card> cards;

    public User() {
        super();
    }
}

Вот мой объект Card:

@Entity
public class Card implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private String number;

    @Column(name = "EXP_DATE")
    @Temporal(TemporalType.DATE)
    private Date expDate;

    @Column(name = "VALIDATOR")
    private int validator;

    @Transient
    private String endsWith;

    public Card() {
    }
}

Поэтому, когда создается мой servlet, я загружаю пользователя из базы данных, например userBean.setUser(userFactoryEJB.find(2));, и он работает нормально, я могу получить доступ к электронной почте, bday, имени пользователя и т. Д. Однако, когда я пытаюсьполучить пользовательские карты я получаю следующее сообщение {IndirectList: not instantiated}.Прежде чем можно было бы спросить, я попытался инициализировать список в конструкторе User, и появляется то же сообщение.

Я ожидаю, что пользователь загружается из БД со всеми его картами, уже загруженными в атрибуте card.

1 Ответ

0 голосов
/ 05 декабря 2018

Тип выборки по умолчанию для отношений со значениями коллекции - ленивый.Когда транзакция фиксируется, все загруженные объекты становятся отсоединенными, и вы не можете получить доступ к объектам с отложенной загрузкой.

Я думаю, что вы извлекаете пользователя в другой транзакции.

. Проверьте аннотацию TransactionAttribute.

Некоторые из возможных решений:

1)Вы используете userFactoryEJB в компоненте CDI или в другом компоненте сеанса?Вы должны вызвать userFactoryEJB из другого сессионного компонента или использовать @Transactional для своего компонента CDI.

2) изменить тип выборки на eager.

@ManyToMany(fetch = FetchType.EAGER)
    private List<Card> cards;

3) определить другой метод поиска и вызвать getcrads() перед возвратом пользователя

...