Java Hibernate现有数据库表的OneToMany映射

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

我正在尝试在OneTONE映射中加入休眠实体。我能够从主实体获取给定主键的数据,但是加入实体返回null。我刚开始冬眠,任何帮助都将不胜感激

我有两张桌子

PT_核心

  • 主键:ptId-整数
  • 外键:stId(ST_AUX)-整数
  • 列:ptId,ptName
ST_AUX

  • 主键:stId
  • 列:stId、stName
这两个表由其他应用程序填充,而我的是只读操作

下面是我的第一个实体类(PtCore.java)

StAux是另一个实体,定义如下:

@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;