如何为旧数据库添加JPA关系

时间:2011-07-30 20:53:52

标签: java jpa-2.0 foreign-key-relationship

我来自C#实体框架背景,在Java项目中查看JPA,所以我希望我所面对的只是一个概念问题。

我有一个遗留数据库,我无法改变架构,我需要写一个DAL。

我已经生成(简化了示例)以下实体......

@Entity
@Table(name = "crag", catalog = "rad_dbo")
public class CragEntity {
    private int id;

    @Column(name = "id")
    @Id
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    private int fkSubRegionId;

    @Column(name = "fk_subRegionId")
    @Basic
    public int getFkSubRegionId() {
        return fkSubRegionId;
    }

    public void setFkSubRegionId(int fkSubRegionId) {
        this.fkSubRegionId = fkSubRegionId;
    }
}

@Table(name = "subRegion", catalog = "rad_dbo")
@Entity
public class SubRegionEntity {
    private int id;

    @Column(name = "id")
    @Id
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

我尝试过添加一个与CragEntity的关系,以便我可以访问它的subRegion

@ManyToOne
@JoinColumn(name="fk_SubRegionId",nullable=false)
private SubRegionEntity subRegion;

但是当我尝试运行时

select c from CragEntity c where c.subRegion.region = :area

我得到了一个例外

java.lang.RuntimeException: org.hibernate.QueryException: could
     

不解析属性:subRegion:uk.co.bmc.rad.dal.CragEntity

希望这是可能的,我很慢......

非常感谢您的任何帮助!

2 个答案:

答案 0 :(得分:0)

在您的查询中,您正在搜索属性“subRegion”,但在您的实体定义中,您的名称为“fkSubRegionId”,因此您必须更改var名称或查询。 ;)

编辑:对不起我误解了这段关系。

您可以使用代码中的关系访问属性(不进行HQL查询)吗?

除非您想在查询中仅选择某些字段,否则我建议使用以下查询:

from CragEntity c where c.subRegion.region='theRegion'

答案 1 :(得分:0)

事实证明有几个问题 - 一个是概念性的,一个是IntelliJ如何产生我正在复制的关系,另一个是椅子和键盘之间......

IntelliJ在“错误”端选择了区域与所有者的子区域关系 - 可能是架构问题而不是IntelliJ的错误。一旦我意识到并找到了解决方案,我可以将其复制到CragEntity和SubRegionEntity

在CragEntity中我添加了:

private SubRegionEntity subRegion;

        @ManyToOne
        @JoinColumn(name="fk_SubRegionId",nullable=false)
        public SubRegionEntity getSubRegion() {
            return subRegion;
        }

        public void setSubRegion(SubRegionEntity subRegion) {
            this.subRegion = subRegion;
        }

然后在SubRegionEntity中我添加了:

private List<CragEntity> crags;

    @OneToMany(mappedBy = "subRegion")
    List<CragEntity> getCrags() {
        return crags;
    }

    public void setCrags(List<CragEntity> crags) {
        this.crags = crags;
    }

此外,似乎任何将成为关系一端的实体类都必须实现可序列化(我猜这些实体被序列化为所有者。因此需要添加到SubRegionEntity和RegionEntity

我的愚蠢当然是查询应该是c.subRegion.region.name,否则我将RegionEntity类型的对象与字符串... doh进行比较 - 这是我非常愚蠢的错误。

我是TDD的新手,但是一旦我为现有代码编写我认为应该发生的测试,我就会一直走过我的错误(并通过异常和错误给出谷歌关键字: - ))< / p>