当前位置: 首页 > 知识库问答 >
问题:

Hibernate现有DB表的OneToMany映射

夹谷星纬
2023-03-14

我正在尝试在OneToOne映射中加入Hibernate实体。我能够从Main Entity获取给定主键的数据,但是加入实体返回null。我是Hibernate新手,任何帮助都将不胜感激。

我有两张桌子,

PT\U核心

  • 主键:ptId—整数

ST_AUX

  • 主键:stId;
  • 列:stId, stName

这两个表由其他应用程序填充,而我的是只读操作。

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

@Entity
@Table(name="PT_CORE")
public class PtCore implements Serializable{

    @Id
    @Column(name="ptId", nullable = false)
    private int id; 

    @Column(nullable=false)
    private int stId;  //The Foreign key column

    @OneToOne
    @JoinTable( name = "core_aux", joinColumns = {@JoinColumn(Name="ptId")},
                    inverseJoinColumns = {@JoinColumn(Name="stId")}
                )
    private StAux staux;

    //Getters, setters and toString() for above 
}

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类变量为空,表示连接没有按预期工作。

共有2个答案

施俊明
2023-03-14

在您的关系中,拥有方是PtCore,反向是StAux。

在双向OneToOne关系中,反向侧必须具有映射属性。实际上,mappedBy属性包含拥有方的关联字段的名称。

因此,您必须更改反向端代码(StAux实体)。您必须将mappedBy属性添加到StAux类中的OneToOne中:

 @OneToOne(mappedBy="staux")                       
  private PtCore ptcore;
司马宏茂
2023-03-14

首先,您的PT_CORE中存在映射信息。我假设它类似于FOREIGN KEY(stid)REFERENCES(stid)。如果您想使用现有的模式和存量数据,我猜没有映射表core_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指令再次自动生成这些表和约束,可能会出现错误。

例如,请检查此项以获取更多信息。

更新:刚刚意识到在您的标题中是@OneToOne,但在您的代码中是@OneToOne

所以你可能想详细说明你的问题和/或标题。

 类似资料:
  • 我们必须在可选元素“mappedby”中指定什么。是特定模型的table_name还是classname? 哪个是正确的? 这个

  • 我对冬眠学习还不熟悉,所以研究冬眠学习中使用的关系。我所了解的是-对于带有外键的一域单向关系映射,连接列将位于目标实体中(在我的示例中为Review类)。我不需要让它双向运行。 但是在实现它的同时,我得到了以下错误: OneToMany-单向-示例3 请帮帮忙!!!

  • 问题内容: 对于@OneToMany关系,我必须映射到Objects吗? 我有下面的例子 如果酒吧是我的目标 问题就解决了 但是,我要避免创建仅代表一对字符串(引用键,值)的对象。 FOO和BAR存储在单独的表中 问题答案: 是您要寻找的。这使您可以为非实体类(例如Embeddable或Basic)定义映射。 http://en.wikibooks.org/wiki/Java_Persistenc

  • toString()]hibernate:/*插入com.pissolato.api.entitys.sale*/插入到sale(company,created,description,discount,sub_value,type,updated,user,value)值(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

  • 问题内容: 这是我在堆栈上的第一个问题,所以请谨慎:D 我正在尝试创建hibernate的OneToMany关系。当我尝试从数据库中获取一些数据时,出现了StackOverflowError。但是,当我删除OneToMany部分时,一切正常。这是我的REST服务的一部分,目前它可以在VMware vFabric Server和MySQL DB上运行。 获取示例: MySQL脚本: 类: 错误: 编

  • 问题内容: 我遇到一个问题,其中Hibernate(4.1.8.FINAL)返回带有NULL值的列表(单向OneToMany映射)。 我得到的是: 我得到一个大小为21的列表,其中EntryAddress在第10个索引上,而2nd Entry Address在第20个索引上。 我所期望的 -我期望一个只有两个EntryAddress对象的List: 这是最小的源代码: 这是mysql结构(Inno