Java Hibernate现有数据库表的OneToMany映射
我正在尝试在OneTONE映射中加入休眠实体。我能够从主实体获取给定主键的数据,但是加入实体返回null。我刚开始冬眠,任何帮助都将不胜感激 我有两张桌子 PT_核心Java Hibernate现有数据库表的OneToMany映射,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我正在尝试在OneTONE映射中加入休眠实体。我能够从主实体获取给定主键的数据,但是加入实体返回null。我刚开始冬眠,任何帮助都将不胜感激 我有两张桌子 PT_核心 主键:ptId-整数 外键:stId(ST_AUX)-整数 列:ptId,ptName ST_AUX 主键:stId 列:stId、stName 这两个表由其他应用程序填充,而我的是只读操作 下面是我的第一个实体类(PtCore.java) StAux是另一个实体,定义如下: @Entity @Table(name="ST
- 主键:ptId-整数李>
- 外键:stId(ST_AUX)-整数李>
- 列:ptId,ptName
- 主键:stId李>
- 列:stId、stName
@Entity
@Table(name="ST_AUX")
public class StAux implements Serializable {
@Id
@Column(nullable=false)
private Integer stId;
@OneToOne
private PtCore ptcore;
@Column
private String stName;
//Getters, Setters and toString follow.
}
我在服务方法中执行以下操作:
PtCore obj = (PtCore) session.get(PtCore.class,1);
System.out.println(obj);
在结果中,我得到了ptName的值,但是stAux类变量为null,这表明连接没有按预期工作。在您的关系中,拥有方是PtCore,相反方是stAux 在双向OneToOne关系中,反向侧必须具有
mappedBy
属性。实际上,mappedBy
属性包含拥有方的关联字段的名称
所以,您必须更改反向端代码(StAux实体)。您必须将mappedBy
属性添加到StAux类中的@OneToOne
:
@OneToOne(mappedBy="staux")
private PtCore ptcore;
首先,您的
PT\u核心中存在映射信息。我假设它类似于外键(stid)引用(stid)
。如果您想使用现有的模式和现有的数据,我想没有真正存在的映射表core\u aux
。至少你没提。然而,它作为@JoinTable
注释可见,但仍然存在上述外键,它似乎是真正的映射(因此也不是连接表)
我建议如下
去掉这个
@Column(nullable=false)
private int stId; //The Foreign key column
从您的PtCore
。我认为这是不必要的。同样在PtCore
中,删除@JoinTable
(因为我上面说过),并将映射信息添加到@OneToOne
注释中,如:
@OneToOne
@JoinColumn(name = "stid")
private StAux staux;
从您的PT\u核心
然后在StAux
中也稍微改变一下:
@Id
@Column(name = "stid") // this might not be needed but if there is like "st_id"...
private Integer stId; // so just for sure
@OneToOne(mappedBy = "staux")
private PtCore ptcore;
因为您有现有的表和约束,所以如果hibernate试图通过JPA指令再次自动生成这些表和约束,可能会出现错误
查看更多信息
更新:刚刚意识到,在你的标题中是@OneToMany
,但在你的代码中是@onetomone
因此,您可能需要详细阐述一下您的问题和/或标题。尝试上述解决方案时,我遇到以下错误:ORA-02275:在table@SauravOjha您可能需要检查您的hibernate配置以自动生成内容。我很快会更新我的答案。
@Id
@Column(name = "stid") // this might not be needed but if there is like "st_id"...
private Integer stId; // so just for sure
@OneToOne(mappedBy = "staux")
private PtCore ptcore;