Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Gepar
1182 / 538 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
1

Hibernate: LazyInitializationException заменить на null поля / etc

15.04.2013, 20:12. Просмотров 871. Ответов 2
Метки нет (Все метки)

У меня в проекте используеться hibernate, а в нём как известно есть возможность подтягивать сущности как полностью со всеми их связями так и только их собственные поля. Например есть сущность
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
public class ContactInfo implements java.io.Serializable {
    private static final long serialVersionUID = 1L;
 
    private Integer cntId;
    private ContactType contactTypes;
    private Employee employee;
    private String cntInf;
 
    public ContactInfo() {
    }
 
    public ContactInfo(Integer cntId, Employee employee, String cntInf) {
        this.cntId = cntId;
        this.employee = employee;
        this.cntInf = cntInf;
    }
 
    public ContactInfo(Integer cntId, ContactType contactTypes, Employee employee,
                       String cntInf) {
        this.cntId = cntId;
        this.contactTypes = contactTypes;
        this.employee = employee;
        this.cntInf = cntInf;
    }
 
    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    @Column(name = "CNT_ID", unique = true, nullable = false)
    public Integer getCntId() {
        return this.cntId;
    }
 
    public void setCntId(Integer cntId) {
        this.cntId = cntId;
    }
 
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TYPE_ID")
    public ContactType getContactTypes() {
        return this.contactTypes;
    }
 
    public void setContactTypes(ContactType contactTypes) {
        this.contactTypes = contactTypes;
    }
 
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "EMP_ID", nullable = false)
    public Employee getEmployee() {
        return this.employee;
    }
 
    public void setEmployee(Employee employee) {
        this.employee = employee;
    }
 
    @Column(name = "CNT_INF", nullable = false, length = 50)
    public String getCntInf() {
        return this.cntInf;
    }
 
    public void setCntInf(String cntInf) {
        this.cntInf = cntInf;
    }
 
    @Override
    public String toString() {
        return "ContactInfo{" +
                "cntId=" + cntId +
                ", contactType {" + contactTypes.getTypeId() + "," + contactTypes.getType() + "}" +
                ", employee {" + employee.getEmpId() + ", " + employee.getEmpFname() + "}" +
                ", cntInf='" + cntInf + '\'' +
                '}';
    }
 
}
Как видно у неё есть свои pojo поля (или в этом контексте слово pojo нельзя применить): cntId, cntInf, а есть поля уже объектного типа contactTypes и employee. У меня есть методы которые вытягивают запись из базы (те вот такую вот сущность) как со всеми связями так и без и на это есть необходимость.

Проблема: Hibernate когда вытягивает данные без связей он инициализирует как-то по своему contactTypes и employee (они != null даже если те объекты не подтягивались с базы) что при обращении к этим объектам сразу вываливается эксепшн:
Код
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
но это мне ну ооочень неудобно, я бы хотел чтобы оно просто оставляло те поля null если оно их не подтягивает ну или ещё что с ними делало но лишь бы не подтягивался тот хитрый hibernate объект.

Причина этого: я объекты этой сущности сериализирую и передаю с сервера на клиент, а вот в таком виде как есть оно начинает требовать hibernate и на клиенте при десериализации на случай вдруг клиент вздумает дёрнуть те неподтянутые поля, а это реально проблема. Если уж спринг у клиента это ладно, то 5мб hibernate-core это слишком
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2013, 20:12
Ответы с готовыми решениями:

Jquery-ajax и hibernate возвращает null хотя данные в базе есть
не выводятся данные из базы.думал это из-за скорости ajax запроса.т.е он...

Hibernate необязательные поля
Как сделать маппинг сущностей между собой, чтобы некоторые поля были...

LazyInitializationException или как правильно написать @Query
у меня есть 2 сутности Первая сутность это главная компания @Entity public...

Spring mvc org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Добрый день. Помогите исправить ошибку. Проблема после AJAX запроса: $.ajax({...

[Hibernate] Удалить сущность с null constraint
БД выглядит следующим образом(без roles и user_roles): В users_playlists...

2
Skipy
1996 / 1419 / 91
Регистрация: 25.11.2010
Сообщений: 3,611
16.04.2013, 11:47 2
Цитата Сообщение от Gepar Посмотреть сообщение
Причина этого: я объекты этой сущности сериализирую и передаю с сервера на клиент, а вот в таком виде как есть оно начинает требовать hibernate и на клиенте при десериализации на случай вдруг клиент вздумает дёрнуть те неподтянутые поля, а это реально проблема. Если уж спринг у клиента это ладно, то 5мб hibernate-core это слишком
Причина этого - в неправильной архитектуре. Для передачи на клиента существует шаблон проектирования DTO - Data Transfer Object. На сервере Вы создаете эти объекты на базе полученных entities и передаете на клиента. Таким образом, во-первых, не тащите ничего лишнего, во-вторых, формируете пакет передачи на сервере, где сессия Hbernate открыта и есть всё необходимое.
1
Gepar
1182 / 538 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
16.04.2013, 13:27  [ТС] 3
Skipy, наверное вы правы, думаю теперь как засунуть в мой проект ещё одну эту прослойку ... Хотя это ведь получиться что я читаю объект с базы, а потом на его основе создаю другой объект "попроще" и его уже отдаю клиенту,а это лишнее копирование туда-сюда, ну да сейчас подумаю что с этим сделать.

Добавлено через 51 минуту
Skipy, а всё же можно ли получать unmanaged объекты от entity manager, те по сути от хибернейта? Ну те мне не надо те лишние связи, вот хочу чтобы они были null раз я их не просил.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2013, 13:27

изменить св-во поля на NOT NULL
Есть таблица с данными, нужно изменить св-во поля Sender с NULL На NOT NULL....

Сравнение поля с Null
Подскажите, как правильно сравнивать с NULL поле ADOQuery, ругается, что нельзя...

Почему значение поля - null?
Объясните пожалуйста, почему в данном случае ссылка имеет значение null. И как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru