Java 如何针对遗留数据库添加JPA关系
我来自C#entity framework背景,在Java项目中研究JPA,所以我希望我所面临的只是一个概念问题 我有一个遗留数据库,我不能改变它的模式,我需要编写一个DAL 我已经生成(简化了示例)以下实体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
@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关键字:-))