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

Hibernate:在不实际使用任何主/外键关系的情况下使用OneTo多国

单于善
2023-03-14

我看过几百个帖子,跟我的不太像:(

请考虑以下情况。

Mysql架构:

create table parent(
id int,
col1 int,
col2 int,
primary key(id)
)

create table child(
id int,
col1 int,
col2 int,
primary key(id)
)

请注意,父级之间没有明确的/关键的关系

现在,我只想获取所有具有相同col1值的“子”对象

我尝试过的那种Hibernate实体,

@Entity
public class parent{

@Id
private int id;

@Column
private int col1;

@Column
private int col2;

@OneToMany
@JoinColumns({
    @JoinColumn(name = "col1"),
    @JoinColumn(name = "col2")
})
private List<Child> children;

/**
Other logic goes here..
**/

}

子实体为,

@Entity
public class Child{

@Id
private int id;

@Column
private int col1;

@Column
private int col2;

/**
Other logic goes here..
**/
}

结果:Hibernate错误报告“从“Parent”引用“Child”的外键的列数错误。应为1”

我将其解释为,@JoinColumn只能使用“id”完成

问题:

1) hibernate的所有@OneToMany@manytone等是否需要表之间/实体处的显式/键引用[由@Id注释]?

2)我应该做些什么来实现这一点?

共有2个答案

宰父熙云
2023-03-14

尝试使用:
@OneTo许多@JoinColns({@JoinCollie(name="col1",参考列名="col1"),@JoinCollie(name="col2",参考列名="col2") })

於和志
2023-03-14

这里,TableA与TableB有一对一的关系,即TableA中的一条记录可以在TableB中有多条记录。因为表A中的col1在表B的col1中被引用为外键。下面的JPA代码成功地获取了所有结果。

DROP table x.TableA;
CREATE TABLE x.TableA (
    Id BIGINT IDENTITY(1,1) NOT NULL,
    col1 varchar(30) NOT NULL,
    CONSTRAINT PK_col1 PRIMARY KEY(col1) 
);

DROP table x.TableB;
CREATE TABLE x.TableB ( 
    Id BIGINT IDENTITY(1,1)NOT NULL,
    col1 varchar(30) NOT NULL,
    col2 varchar(10) NULL
);

ALTER TABLE x.TableB
   ADD CONSTRAINT FK_TableB_col1 FOREIGN KEY (col1)
      REFERENCES x.TableA (col1)
;
@Entity
@Table(name = "TableA", schema = "x")
public class ClassA implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(name = "col1")
  private String col1;


  @OneToMany(
      cascade = {CascadeType.ALL},
      orphanRemoval = true,
      fetch = FetchType.EAGER)
  @JoinColumn(name = "col1", referencedColumnName = "col1")
  private List<ClassB> objB = new ArrayList<>();
}

----------------------------------


@Entity
@Table(name = "TableB", schema = "x")
public class ClassB implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(name = "col1")
  private String col1;

  @Column(name = "col2")
  private String col2;

}

 类似资料:
  • 我目前在数据库中的一对一/多对一映射时遇到问题。我希望我的图书表具有与“出版商”、“流派”、“评级”和“状态”表的@ManyToOne映射。 这是我的Book实体类的外观: 例如,我的Publisher实体类(类型、评级和状态类完全相同): 唯一的区别是类型、评级和状态的书籍字段,f. e: 这就是我的堆栈跟踪的样子: 更新的堆栈跟踪:

  • 我们系统的所有用户都来自一个主“用户”类。同样,我们希望以相同的方式构造数据库,拥有一个主“用户”表,该表与特定用户类型的必要表连接,以提供额外的用户信息。 以这三个基本表格为例: 表用户 user_id|user_email|user_firstname|user_lastname|... 表雇员 user_id|employee_staff_number|... 表管理 user_id|adm

  • 我如何才能做到这一点,使我的A实体仅由B的外键持久化?也就是说,只有外键被插入到数据库中(因为B是一个主表,所以我不需要插入元素)。

  • 问题内容: 我有两个实体: 保存首选项时,我具有accountId,但没有Account实体。在这种情况下,如何保存首选项? 加载帐户实体并在首选项上进行设置?对我来说,这似乎是对数据库的错误旅行。 是否具有一个可持久保存的accountId字段并使Account字段为只读?同时拥有一个accountId字段和一个Account字段似乎多余吗? 使用NamedQuery保留首选项?我希望只是通用地

  • 我决定在我最近开始的项目中使用JPA 2.1的实体图功能,但我遇到了一个问题。 当您将图形扩展到 ManyToOne 关系上时,效果很好,但对于 OneToMany,结果会重复,因为我的提供程序(Hibernate)使用左外连接。 我看到一些解决方案,他们提出了独特的关键字来解决这个问题,但我认为这是一个棘手的解决方案,即使我们如何才能让下一级实体不同。 我的意思是,如果我有3个实体A、B和C,我

  • 问题内容: 我回到Java世界,并尝试使用JPA,Hibernate和PostgreSQL配置一个新的Spring Web应用程序。 我发现了许多带有各种XML配置文件的较早的示例,并且我想知道是否存在一种不依赖XML文件编写的执行该配置的首选新方法。 我需要配置的一些东西是hibernateSQL方言,驱动程序等。 问题答案: 将以下片段放入带有和注释的类中 Hibernate / JPA(编辑