Спящий режим с проблемой аннотации JPA - ленивый объект - PullRequest
1 голос
/ 23 февраля 2011

У меня есть таблица USER, связанная со многими другими таблицами, как правило, со звездообразной топологией.

Как это:

@Entity
@Table(name = "user")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name = "user_USERID_GENERATOR", sequenceName = "user_SEQ")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "userR_USERID_GENERATOR")
    @Column(name = "user_id")
    private long userId;

    @Basic
    @Column(name = "password_hex")
    private String password;

    @Basic
    @Column(name = "language")
    private String language;

    @Temporal(TemporalType.DATE)
    private Date created;

    @Temporal(TemporalType.DATE)
    private Date modyfied;

    @Basic
    @Column(name = "first_name")
    private String firstName;

    @Basic
    @Column(name = "last_name")
    private String lastName;

    @Basic
    @Column(name = "passport")
    private String passport;

    @Basic
    @Column(name = "pesel")
    private String pesel;

    @Basic
    @Column(name = "phone_nr1")
    private String phoneNr1;

    @Basic
    @Column(name = "phone_nr2")
    private String phoneNr2;

    @Column(name = "hash")
    private String hash;


    // uni-directional many-to-one association to DictUserType
    @ManyToOne
    @JoinColumn(name = "status")
    private DictUserStatus status;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = { CascadeType.ALL })
    private Set<Email> emails = new HashSet<Email>(0);

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = { CascadeType.ALL })
    private Set<Address> address = new HashSet<Address>(0);

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = { CascadeType.ALL })
    private Set<ArchivePasswords> archivePasswords = new HashSet<ArchivePasswords>(
            0);

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = { CascadeType.ALL })
    private Set<HostsWhitelist> hostsWhitelist = new HashSet<HostsWhitelist>(0);

.... У меня есть слой DAO, метод поиска по идентификатору пользователя.

public User findUser(long userId) throws UserNotFoundException {
    User user = userDao.findUser(userId);
    if (user == null) {
        throw new UserNotFoundException("Could not find user with id = "
                + userId);
    }

    return user;
}

Почему ленивая загрузка не работает?

Ответы [ 3 ]

0 голосов
/ 24 февраля 2011

Если вы хотите получить пользователя с электронной почтой.

    @Transactional
    public List getUserWithEmails(long userId){
        User user = userDao.findUser(userId);
        if (user == null) {
            throw new UserNotFoundException("Could not find user with id = "
                    + userId);
        }
        for(Email email:user.getEmails()){
            email.getId();
        }
        return user;
    }

Та же процедура применяется к другим наборам «один ко многим».Как и другие заявляют, вам нужно добавить OpenSessionInView (Hibernate) фильтр или OpenEntityManagerInView (JPA) фильтр в web.xml

0 голосов
/ 16 декабря 2013

Если не указано, функция Ленивый Фет не будет иметь значения по умолчанию EAGER.

public @interface Basic Самый простой тип отображения в столбце базы данных. Аннотация Basic может быть применена к постоянному свойству или переменной экземпляра любого из следующих типов: примитивные типы Java, обертки примитивных типов, String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, byte [], Byte [], char [], Character [], enums и любой другой тип, который реализует Java. io.Serializable.

Использование аннотации Basic необязательно для постоянных полей и свойств этих типов. Если для такого поля или свойства базовая аннотация не указана, будут применяться значения по умолчанию для базовой аннотации.

  Example 1:

    @Basic
    protected String name;

    Example 2:

    @Basic(fetch=LAZY)
    protected String getName() { return name; }

получить

public abstract FetchType fetch

(Необязательно) Определяет, должно ли значение поля или свойства загружаться лениво или его нужно извлекать с нетерпением. Стратегия EAGER - это требование времени выполнения поставщика постоянства, что значение должно быть извлечено с нетерпением. Стратегия LAZY - это подсказка времени выполнения провайдера. Если не указано, по умолчанию EAGER.

Default:
javax.persistence.FetchType.EAGER
optional

public abstract boolean optional

(Необязательно) Определяет, может ли значение поля или свойства быть нулевым. Это подсказка и игнорируется для примитивных типов; это может быть использовано при генерации схемы. Если не указано, по умолчанию используется значение true. По умолчанию: правда

0 голосов
/ 24 февраля 2011

Вы должны опубликовать трассировку стека, которую вы получаете. Где происходит исключение LazyLoadingException? На пользовательском объекте? Вы пытаетесь получить к нему доступ из другого объекта?

Это пресловутое исключение LazyInitializationException? Если это так, то вам нужно либо пройти по графу объектов вручную в сервисе (предполагая, что фрагмент кода DAO на самом деле является методом Service, а не сам DAO), либо исследовать OpenSessionInViewFilter (предполагая, что вы используете Spring).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...