Java 使用hibernate注释映射@ManyToMany关系

Java 使用hibernate注释映射@ManyToMany关系,java,sql,hibernate,annotations,Java,Sql,Hibernate,Annotations,更新:我看到了数据库关系,我意识到模块表有两个对单元表的引用(nid,unnr),但单元表没有对模块表的引用,它只有使用nid的子架表。首先,当前显示的所有代码都混淆了一些东西 您定义了一个@JoinTable注释,这意味着您有三个表,一个带单元,一个带模块,一个带两个实体的id 我要说的第二句话是,你们谈论的是模块和单元之间的一对一关系,但在你们的示例代码中,你们把一个多对多 如果我遵循您的描述,我会在代码中按照如下方式构建它: @Entity @Table(name = "unit") pu

更新:我看到了数据库关系,我意识到模块表有两个对单元表的引用(nid,unnr),但单元表没有对模块表的引用,它只有使用nid的子架表。

首先,当前显示的所有代码都混淆了一些东西

您定义了一个@JoinTable注释,这意味着您有三个表,一个带单元,一个带模块,一个带两个实体的id

我要说的第二句话是,你们谈论的是模块和单元之间的一对一关系,但在你们的示例代码中,你们把一个多对多

如果我遵循您的描述,我会在代码中按照如下方式构建它:

@Entity
@Table(name = "unit")
public class Unit {
@Column(name = "nid")
private int nid;
@Id
@GeneratedValue
@Column(name = "unnr")
private int unnr;
@Column(name = "unhwtype")
private int unhwtype;
@Column(name = "unslot")
private int unslot;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "nid")
private Module module;

@Entity
@Table(name = "module")
public class Module {
@Column(name = "nid")
private int nid;
@Id
@Column(name = "mpos")
private int mpos;
@Column(name = "mhwtype")
private int mhwtype;
@OneToMany(mappedBy = "module", cascade = {CascadeType.ALL})
private Set units;

问题是,我不确定这是否可行,因为nid不是模块实体中的ID列,我认为您需要更改设计,使nid成为ID列。。。您可以用这段代码尝试一下,希望它能工作,否则将模块实体中的nid更改为ID。

您是否尝试直接在数据库上运行generate查询并查看它是否返回任何值?这些表中有数据吗?但我认为我的映射不正确。所以它返回一个空列表。尝试一步一步地构建它,首先尝试单向,然后移动到双向。在Unit.java中,删除@manytomy(targetEntity=Module.class,mappedBy=“units”)注释。在Module.java中,删除referencedColumnName属性并尝试一下。我删除了这些注释。我将发布更新。但我还是很空虚。对不起,我误解了你的问题。你能删除两个表之间的关系以查看是否仍然得到一个空列表吗?Yoeri,我按照你说的更改了代码。但名单仍然是空的。我会尝试将de-nid作为一个ID,但如果我这样做,我会保留mpos的ID注释,或者删除它,然后只添加nid的ID注释?嗨,Murilo,我假设Hibernate不能在同一个实体上使用2个@ID注释,所以我建议只将ID添加到nid上,然后将其从mpos中删除。