Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate JPA: последовательность столбцов 
:(
    Опции темы
Andrey1
Дата 14.9.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



Вылетает вот такой exception:
Код

javax.persistence.EntityNotFoundException: Unable to find jpa.entity.Solution with id jpa.entity.SolutionPK[solutionId=4, taskId=2002, moduleId=1846]
        at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:113)
...


Exception вылетает тут:
Код

em.createQuery("select o from Fieldvalue o where " +
                "o.id.solutionId = :solutionId"
                )
                .setParameter("solutionId", solutionId.intValue())
                .getResultList()


Проблема в том, что
1) Запрос идет к Fieldvalue, а exception вылетает для Solution.
2) jpa.entity.SolutionPK[solutionId=1849, taskId=2002, moduleId=4] действительно не существует, поскольку перепутаны значения составных значений ключа (должно быть taskId=4).
3) Порядок полей ключа в jpa.entity.SolutionPK и в Fieldvalue такой же, как описан в базе.
4) Fieldvalue действительно связан с Solution как @ManyToOne.

Код

...
@Entity
@Table(name = "Fieldvalue")
public class Fieldvalue extends Serializable {

    @EmbeddedId
    private FieldvaluePK id;
    ...

    @ManyToOne
    @JoinColumns({        
        @JoinColumn(name = "TASK_ID", nullable=false, insertable = false, updatable = false)
        , @JoinColumn(name = "SOLUTION_ID", nullable=false, insertable = false, updatable = false)
    , @JoinColumn(name = "MODULE_ID", nullable=false, insertable = false, updatable = false)
    })
    
    private Solution solution;
...
}
@Embeddable
public class FieldvaluePK implements Serializable {

    @Basic(optional = false)
    @Column(name = "TASK_ID")
    private int taskId;

    @Basic(optional = false)
    @Column(name = "SOLUTION_ID")
    private int solutionId;

    @Basic(optional = false)
    @Column(name = "MODULE_ID")
    private int moduleId;

    @Basic(optional = false)
    @Column(name = "FIELD_ID")
    private int fieldId;
...
}
...
public class Solution implements Serializable {

    @EmbeddedId
    protected SolutionPK solutionPK;
...
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "solution")
    private List<Fieldvalue> fieldvalueCollection = new ArrayList<Fieldvalue>();
...
}
...
@Embeddable
public class SolutionPK implements Serializable {
    @Basic(optional = false)
    @Column(name = "TASK_ID")
    private Integer taskId;
    @Basic(optional = false)
    @Column(name = "SOLUTION_ID")
    private Integer solutionId;
    @Basic(optional = false)
    @Column(name = "MODULE_ID")
    private Integer moduleId;
...
}


Откуда берется неправильная последовательность столбцов?

Это сообщение отредактировал(а) Andrey1 - 14.9.2009, 22:31


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
MisterCleric
Дата 15.9.2009, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет. Ты знаешь, я как-то не заморачивался на разные способы меппинга композитного ключа. Один раз выбрал для себя способ и всегда усе работает:
Код

public class CurrencyRatePk implements Serializable {

    @Temporal(TemporalType.DATE)
    private Date arcDate;
    private Long currencyId;

// getters & setters

//    public boolean equals(Object o) 
  //  public int hashCode()
}


@Entity
@IdClass(CurrencyRatePk.class)
public class CurrencyRate implements Serializable {
    @Id
    private Date arcDate;
    @Id
    private Long currencyId;

    private Double rate;

    private Long base;

// getters & setters

}



итого: у тебя в запросе будет просто:
Код

em.createQuery("select o from Fieldvalue o where " +
                "o.solutionId = :solutionId"
                )


что-то я как раз нарекаю на вот эту конструкцию o.id.solutionId
Покажи запрос, который сгенерировался при вызове


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Andrey1
Дата 15.9.2009, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 2
Всего: 5



С тем запросом все в порядке. Проблема с запросом по связи:

Код

select solution0_.MODULE_ID as MODULE1_14_1_, solution0_.SOLUTION_ID as SOLUTION2_14_1_, solution0_.TASK_ID as TASK3_14_1_, 
solution0_.CALCULATION_DURATION as CALCULAT4_14_1_, solution0_.CALCULATION_TIME_START as CALCULAT5_14_1_, solution0_.FREQUENCY 
as FREQUENCY14_1_, solution0_.STATE as STATE14_1_, solution0_.VERIFICATIONCOUNT as VERIFICA8_14_1_, analytical1_.MODULE_ID as 
MODULE1_0_0_, analytical1_.AUTHOR as AUTHOR0_0_, analytical1_.INTERFACECLASS as INTERFAC3_0_0_, analytical1_.MODULENAME as 
MODULENAME0_0_, analytical1_.RELEASEDATE as RELEASED5_0_0_, analytical1_.VERSION as VERSION0_0_ 
from SOLUTION solution0_ inner join ANALYTICALMODULE analytical1_ on 
solution0_.MODULE_ID=analytical1_.MODULE_ID where solution0_.MODULE_ID=? and solution0_.SOLUTION_ID=? and solution0_.TASK_ID=?


Исправил в Fieldvalue порядок столбцов на:

Код

...
public class Fieldvalue implements Serializable {
...
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "MODULE_ID", nullable=false, insertable = false, updatable = false)
        , @JoinColumn(name = "SOLUTION_ID", nullable=false, insertable = false, updatable = false)
        , @JoinColumn(name = "TASK_ID", nullable=false, insertable = false, updatable = false)
    })

    private Solution solution;
...
}


и ошибка пропала.

Хм. Почитал описание @JoinColumns и узнал, что обязательно нужно описывать referencedColumnName="TASK_ID".
Описал. Теперь правильно работает при любом порядке  smile  smile 

Это сообщение отредактировал(а) Andrey1 - 15.9.2009, 09:57


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.