Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何针对遗留数据库添加JPA关系_Java_Jpa 2.0_Foreign Key Relationship - Fatal编程技术网

Java 如何针对遗留数据库添加JPA关系

Java 如何针对遗留数据库添加JPA关系,java,jpa-2.0,foreign-key-relationship,Java,Jpa 2.0,Foreign Key Relationship,我来自C#entity framework背景,在Java项目中研究JPA,所以我希望我所面临的只是一个概念问题 我有一个遗留数据库,我不能改变它的模式,我需要编写一个DAL 我已经生成(简化了示例)以下实体 @Entity @Table(name = "crag", catalog = "rad_dbo") public class CragEntity { private int id; @Column(name = "id") @Id public int

我来自C#entity framework背景,在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;
    }
}

我试着给Cragenty添加一个关系,这样我就可以访问它的子区域

@ManyToOne
@JoinColumn(name="fk_SubRegionId",nullable=false)
private SubRegionEntity subRegion;
但是当我试着跑的时候

select c from CragEntity c where c.subRegion.region = :area
我有个例外

未解析属性:子区域:uk.co.bmc.rad.dal.CragEntity

希望这是可能的,我正在慢慢地


非常感谢您的帮助

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

编辑:对不起,我误读了这个关系

您是否可以使用代码中的关系访问属性(无需进行HQL查询)

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

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

结果发现有几个问题——一个是概念性的,一个是IntelliJ如何产生我正在复制的关系,还有一个是椅子和键盘之间的关系

IntelliJ在“错误”的一端选择了与所有者的区域到子区域关系-可能是架构问题,而不是IntelliJ的错误。一旦我意识到了这一点并找到了解决办法,我就可以把它复制到克拉根蒂和次区域

在克拉根蒂,我补充道:

private SubRegionEntity subRegion;

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

        public void setSubRegion(SubRegionEntity subRegion) {
            this.subRegion = subRegion;
        }
private List<CragEntity> crags;

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

    public void setCrags(List<CragEntity> crags) {
        this.crags = crags;
    }
然后在次区域我补充说:

private SubRegionEntity subRegion;

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

        public void setSubRegion(SubRegionEntity subRegion) {
            this.subRegion = subRegion;
        }
private List<CragEntity> crags;

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

    public void setCrags(List<CragEntity> crags) {
        this.crags = crags;
    }
私有列表岩;
@OneToMany(mappedBy=“子区域”)
列表getCrags(){
返回岩;
}
公共空岩(列表岩){
这个.峭壁=峭壁;
}
此外,似乎任何实体类都必须实现serializable(我猜这些实体会被序列化到所有者中),这需要添加到SubcionEntity和RegionEntity中

当然,我的愚蠢之处在于,查询应该是
c.subsection.region.name
,否则我将RegionEntity类型的对象与字符串进行比较……doh——我犯了一个非常愚蠢的错误

我是TDD新手,但每当我为我认为现有代码应该发生的事情编写测试时,我都会仔细检查我的错误(并通过异常和错误给出google关键字:-))