hql-запрос к дочерней сущности в двунаправленных ассоциациях - PullRequest
0 голосов
/ 13 марта 2012

Столкнулся с проблемой -

////////////////// GbCapacityEntity class //////////////////
@Entity
@Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.NONE)
@Table(name = "MARKSIST.GB_CAPACITY")
public class GbCapacityEntity {
    @Id
    @Column(name = "ORG_ID")
    private Integer orgId;
...
    @OneToMany(cascade = CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="gbCapacityEntity")
    private List<GbLoadForecast> gbLoadForecast;
    /**
     * 
     * @return
     */
    public List<GbLoadForecast> getGbLoadForecast() {
        return gbLoadForecast;
    }
    /**
     * 
     * @param gbLoadForecast
     */
    public void setGbLoadForecast(List<GbLoadForecast> gbLoadForecast) {
        this.gbLoadForecast = gbLoadForecast;
    }



////////////////// GbLoadForecast class ////////////////// 
@Entity
@Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.NONE)
@Table(name = "MARKSIST.GB_LOAD_FORECAST")
public class GbLoadForecast {
    @Id 
    @Column(name = "ORG_ID")
    private Integer orgId;
...
    @ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
    private GbCapacityEntity gbCapacityEntity;
    /**
     * @return
     */
    public GbCapacityEntity getGbCapacityEntity() {
        return gbCapacityEntity;
    }
    /**
     * @param gbLoadForecast
     */
    public void setGbCapacityEntity(GbCapacityEntity gbCapacityEntity) {
        this.gbCapacityEntity = gbCapacityEntity;
    }
...

////////////////// Some query //////////////////  

        String hql = "FROM com.intellex.marksist.hbn.model.GbLoadForecast E " +
                     "WHERE E.orgId = :id1 AND E.cargoGroup = :id2";

        Session session = HibernateUtil.getMarksistSessionFactory().openSession();
        session.beginTransaction();

        Query query = session.createQuery(hql);
        query.setParameter("id1", orgId);
        query.setParameter("id2", gcId);
        List results = query.list();
        session.close();
...

По инструкции query.list (); выброшенное исключение - [java] 4085 ["http-apr-8080" -exec-10] ОШИБКА org.hibernate.util.JDBCExceptionReporter - ORA-00904: "GBLOADFORE0 _". "GBCAPACITYENTITY_ORG_ID": ????????? ??? ?????????????

Кто-нибудь знает почему? Я был бы очень признателен! : -)

=========================================

Добавлена ​​аннотация @ JoinColumn в дочернем классе, и теперь она выглядит так -

////////////////// GbLoadForecast class ////////////////// 
@Entity
@Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.NONE)
@Table(name = "MARKSIST.GB_LOAD_FORECAST")
public class GbLoadForecast {
    @Id 
    @Column(name = "ORG_ID")
    private Integer orgId;
...
    @ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
    @JoinColumn(name = "ORG_ID")
    private GbCapacityEntity gbCapacityEntity;
    /**
     * @return
     */
    public GbCapacityEntity getGbCapacityEntity() {
        return gbCapacityEntity;
    }
    /**
     * @param gbLoadForecast
     */
    public void setGbCapacityEntity(GbCapacityEntity gbCapacityEntity) {
        this.gbCapacityEntity = gbCapacityEntity;
    }
...

Но теперь еще одно исключение - вызвано: org.hibernate.MappingException: повторяющийся столбец в сопоставлении для сущности: com.intellex.marksist.hbn.model.GbLoadForecast column: ORG_ID (должен отображаться с помощью insert = "false" update = "ложь")

Дело в том, я подозреваю, что есть группа с тем же именем столбца ORG_ID имени поля, что и в таблице MARKSIST.GB_LOAD_FORECAST, и в таблице MARKSIST.GB_CAPACITY. Или нет?

1 Ответ

2 голосов
/ 14 марта 2012

Давайте рассмотрим это сопоставление:

@Id 
@Column(name = "ORG_ID")
private Integer orgId;
...
@ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
@JoinColumn(name = "ORG_ID")
private GbCapacityEntity gbCapacityEntity;

Это означает, что идентификатор сопоставлен со столбцом ORG_ID, и у вас также есть столбец, который является внешним ключом для столбца GB_CAPACITY.ORG_ID.и который также называется ORG_ID.

В одной таблице не может быть двух столбцов с одинаковыми именами.Выберите другое имя для вашего столбца соединения:

@JoinColumn(name = "ORG_ID_OF_CAPACITY")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...