首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hql-双向关联中的子实体查询

hql-双向关联中的子实体查询
EN

Stack Overflow用户
提问于 2012-03-13 13:46:11
回答 1查看 460关注 0票数 0

面对问题-

代码语言:javascript
复制
////////////////// 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 ERROR org.hibernate.util.JDBCExceptionReporter - ORA-00904:“GBLOADFORE0_”。“GBCAPACITYENTITY_ORG_ID”:?

有人知道为什么吗?我会非常感激的:)

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

在子类中添加了@ JoinColumn注释,现在看起来如下-

代码语言:javascript
复制
////////////////// 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:实体映射中的重复列引起:org.hibernate.MappingException列: ORG_ID (应该使用insert = "false“更新= "false”映射)

问题是,我怀疑有一堆字段名ORG_ID列的名称与表MARKSIST.GB_LOAD_FORECAST和表MARKSIST.GB_CAPACITY中的名称相同。或者不是?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-14 08:54:51

让我们检查一下这个映射:

代码语言:javascript
复制
@Id 
@Column(name = "ORG_ID")
private Integer orgId;
...
@ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
@JoinColumn(name = "ORG_ID")
private GbCapacityEntity gbCapacityEntity;

这意味着ID被映射到列ORG_ID,并且还有一个列,它是GB_CAPACITY.ORG_ID列的外键,也称为ORG_ID

不能在同一个表中有两个名称相同的列。为联接列选择不同的名称:

代码语言:javascript
复制
@JoinColumn(name = "ORG_ID_OF_CAPACITY")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9685237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档