Java Hibernate:使用OneToMany而不实际使用任何主键/外键关系

Java Hibernate:使用OneToMany而不实际使用任何主键/外键关系,java,mysql,hibernate,Java,Mysql,Hibernate,我看到过数百篇帖子,与我的帖子不同:( 请考虑以下情况: 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) ) 请注意,父表和子表之间没有显式/键关系 现在,我只想在获取“parent”的同时获取所有具有相同值“col1”和“col2”的“child”对象[单向映射

我看到过数百篇帖子,与我的帖子不同:(

请考虑以下情况:

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)
)
请注意,父表和子表之间没有显式/键关系

现在,我只想在获取“parent”的同时获取所有具有相同值“col1”和“col2”的“child”对象[单向映射就足够了]

我尝试过的那种休眠实体

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

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

问题:

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

2) 我应该怎么做才能做到这一点

试试:
@OneToMany
@连接柱({
@JoinColumn(name=“col1”,referencedColumnName=“col1”),
@JoinColumn(name=“col2”,referencedColumnName=“col2”)
})

尝试:
@OneToMany
@连接柱({
@JoinColumn(name=“col1”,referencedColumnName=“col1”),
@JoinColumn(name=“col2”,referencedColumnName=“col2”)

})

此处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)
;

@实体
@表(name=“TableA”,schema=“x”)
公共类ClassA实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“col1”)
私有字符串col1;
@独身癖(
cascade={CascadeType.ALL},
删除=真,
fetch=FetchType.EAGER)
@JoinColumn(name=“col1”,referencedColumnName=“col1”)
私有列表objB=newarraylist();
}
----------------------------------
@实体
@表(name=“TableB”,schema=“x”)
公共类ClassB实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“col1”)
私有字符串col1;
@列(name=“col2”)
私有字符串col2;
}

此处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)
;

@实体
@表(name=“TableA”,schema=“x”)
公共类ClassA实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“col1”)
私有字符串col1;
@独身癖(
cascade={CascadeType.ALL},
删除=真,
fetch=FetchType.EAGER)
@JoinColumn(name=“col1”,referencedColumnName=“col1”)
私有列表objB=newarraylist();
}
----------------------------------
@实体
@表(name=“TableB”,schema=“x”)
公共类ClassB实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“col1”)
私有字符串col1;
@列(name=“col2”)
私有字符串col2;
}

1。二号。通过在JoinColumn中指定referencedColumnName,并删除冗余的col1和col2字段。但是我真的,真的会改为修复模式,并使用正确的键。或者,当试图通过col1和col2查找父实体的“子实体”时,只需使用一个特别的HQL查询。是的,特别的HQL查询是我现在唯一可用的解决方案。添加ReferencedColumnName会引发类似“引用父级的子级的referencedColumnNames(col1,col2)未映射到单个属性”的错误。您不应使用关系字段,如ManyToOne或任何其他字段,而不是id字段。实体应仅通过id关联(单字段id或复合id无关紧要)。因此,在这种情况下,使用单独的HQL,如@JBNizet所建议的,将是最好的方法。Oops:(无论如何,这回答了我两天的搜索!!是否有任何官方文档?要读取更多的引用?1.no.2.通过在JoinColumn中指定referencedColumnName,并删除col1和col2字段,这是多余的。但是我真的,真的会改为修复模式并使用正确的键。或者在尝试通过col1和col2查找父实体的“子项”。是的,即席HQL查询是我现在唯一可用的解决方案。添加ReferenceColumnName会引发类似“未映射到单个属性的子引用父实体的ReferenceColumnNames(col1,col2)”的错误。您不应该像许多其他字段一样,在relation中使用not id字段。实体只应该通过id(不管是单个字段id还是复合id)进行关联。因此,在这种情况下,使用单独的HQL,如@JBNizet所建议的,将是最好的方法。Oops:(无论如何,这回答了我两天的地狱般的搜索!!是否有任何官方文档?更多信息的参考资料?请检查我的评论,这无助于请在代码中添加一些解释,并将代码放入正确的格式。请检查我的评论,这无助于请在代码中添加一些解释,并将代码放入道具er格式。
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;

}