Ответы пользователя по тегу Hibernate
  • Как исправить ошибку с ленивой инициализацией?

    Conacry
    @Conacry
    Вы можете использовать Hibernate.initialize().

    Hibernate.initialize(user.getAutos);
    user.addAuto(auto);

    Это позволит явно проинициализировать прокси-объект. Если у вас будут дополнительные вопросы, пишите, буду рад помочь.
    Ответ написан
  • Как заполнить поле класса (класс = сущности таблицы)?

    Conacry
    @Conacry
    Здравствуйте.

    Зачем вам отдельное поле userName? Используйте связи таблиц (OneToMany, ManyToOne). Так вы получите доступ к сущности User, и далее ко всем его полям.
    Ответ написан
  • Как вывести вложенные данные OneToMany?

    Conacry
    @Conacry
    Здравствуйте.
    Для полного понимания не хватает кода вашего сервис-класса и dao-класса (при его наличии). На мой взгляд проблема в стратегии загрузки связанных объектов (@OneToMany).
    В Hibernate/JPA существует два типа стратегии загрузки связанных объектов: сразу (FetchType=EAGER) или же делать это только при обращении к ним (FetchType=LAZY). На самом деле в случае, когда предметная область имеет сколь-либо сложную структуру связей между объектами, выбор уже сделан – загружать полбазы ради одного объекта, как это было бы при FetchType=EAGER, мягко говоря, неразумно. Поэтому ленивая инициализация в случае коллекций есть наиболее предпочтительная стратегия инициализации связанных объектов [https://habr.com/post/111911/]. По умолчанию для связи OneToMany используется FetchType=LAZY.
    Так что проблема с загрузкой связанных объектов из базы данных.

    В коде вашей модели необходимо добавить анноацию с выбором типа стратегии загрузки:
    ...
    @OneToMany(fetch = FetchType.LAZY)
    private List<QueryParams> queryParams;
    ...


    А в классе-сервисе или DAO-классе перед
    ...
    return testObject;
    ...
    поставить строчку
    Hibernate.initialize(testObject.getQueryParams);
    В таком случае Hibernate загрузит все связанные объекты.
    Если у вас остались вопросы, пишите, готов ответить.
    Ответ написан
    7 комментариев
  • Почему на клиенте теряются данные?

    Conacry
    @Conacry
    Здравствуйте.

    Покопайте на тему "hibernate lazy initialization" (Если вы используете ее в отношении One to Many - fetch = FetchType.LAZY). Проблема в том, что связанный объект не загружается с базы данных (здесь вам нужно почитать про proxy-объекты в hibernate).
    Чтобы явно инициализировать объект с БД, я использовал:
    Hibernate.initialize(Object obj)
    Ответ написан
    Комментировать
  • Java как наконец запустить Hibernate?

    Conacry
    @Conacry
    Здравствуйте.

    Для начала Вам необходимо иметь аннотированный класс, связанный с сущностью в базе данных. Для примера приведу из своего проекта:

    @Entity
    @Table(name = "users")
    public class User implements Serializable {
    
        @Id
        @Column(name = "user_id")
        @GeneratedValue(strategy = GenerationType.SEQUENCE,
                        generator = "users_user_id_seq")
        @SequenceGenerator(name = "users_user_id_seq",
                           sequenceName = "users_user_id_seq",
                           allocationSize = 1)
        private long userId;
    
        @Column(name = "name", nullable = false)
        private String name;
    
        @Column(name = "login", nullable = false, unique = true)
        private String login;
    
        @Column(name = "password", nullable = false)
        private String password;
    
        @Column(name = "email", nullable = false, unique = true)
        private String email;
    
        @Column(name = "enabled", nullable = false)
        private boolean isEnabled;
    
        @Column(name = "reg_date", nullable = false)
        private Date regDate;
    
        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "authority_id", nullable = false)
        private Authority authority;
    
        public long getUserId() {
            return userId;
        }
    
        public void setUserId(long userId) {
            this.userId = userId;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getLogin() {
            return login;
        }
    
        public void setLogin(String login) {
            this.login = login;
        }
    
        @JsonIgnore
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public boolean isEnabled() {
            return isEnabled;
        }
    
        public void setEnabled(boolean enabled) {
            isEnabled = enabled;
        }
    
        @JsonSerialize(using = SqlDateSerializer.class)
        public Date getRegDate() {
            return regDate;
        }
    
        public void setRegDate(Date regDate) {
            this.regDate = regDate;
        }
    
        public Authority getAuthority() {
            return authority;
        }
    
        public void setAuthority(Authority authority) {
            this.authority = authority;
        }
    
        @Override
        public String toString() {
    
            return  "User details" +
                    "Id = " + getUserId() + "\n" +
                    "Name = " + getName() + "\n" +
                    "Login = " + getLogin() + "\n" +
                    "Email = " + getEmail() + "\n" +
                    "Enabled = " + isEnabled() + "\n" +
                    "Role = " + getAuthority().getAuthority().name() + "\n" +
                    "Registration date = " + getRegDate();
        }


    Если Вам будут непонятны какие-либо вещи из класса сущности, напишите в комментарии, я отвечу.

    Далее при конфигурировании Hibernate вам нужно указывать не .addClass(MyClass.class), а configuration.addAnnotatedClass(Main.class).
    Ответ написан
    1 комментарий