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

Hibernate -一对多关联

于正志
2023-03-14

我有两个表,ComputerNode和Connection。ComputerNode有一个主键< code>nodeid,但连接没有主键。我无法修改表模式。如果它们有一对多的关系,我应该如何创建java POJO?基本上我的目标是做一个像这样的内部连接:

select * from `ComputerNode` cn inner join `Connection` c on cn.nodeid = c.nodeid

下面是 SQL 表架构。计算机节点表:

int nodeid <primary key>;
varchar nodename;

连接表:

int nodeid <not primary key>;
varchar connstatus;

表之间的关系是一对多的。一个计算机节点可以有多个连接

我已经创建了两个Java的POJO类,但我不太确定所需的注释。我已经阅读了Hibernate教程,但我没有看到对没有标识符的类的解释(即:连接)。

计算机节点. java:

@Entity
@Table(name="ComputerNodes")
public class ComputerNode {

@Id
@Column(name="nodeid")
private int nodeId;

@Column(name="nodename")
private String nodeName;

@OneToMany
private Set<Connection> connections;

.... //getter and setters
}

Connection.java

//What annotation should i use since this class doesn't have identifier?
public class Connection {

@Column(name="nodeid")
private int nodeId;

@Column(name="connstatus")
private String connStatus;
}

连接应该是什么类型的类@可嵌入?我应该如何在两个类之间创建一对多关系?

================

public List<ComputerNode> getComputerNodes() {
    //the query to inner join is:
    return sessionFactory.getCurrentSession().createQuery("from ComputerNode as node inner join Connection as conn").list();
}

for (ComputerNode cn : getComputerNodes) {
 System.out.println(cn.getNodeId() + ',' + cn.getNodeName());

 for (Connection c : cn.getConnections) {
   System.out.println(c.getConnStatus());
 }
}

共有3个答案

嵇星海
2023-03-14

我真的不知道没有< code>id你要做什么。

也许这能有所帮助...

@OneToMany (cascade = {CascadeType.ALL}) 
@JoinTable(
    name="Connection",
    joinColumns = @JoinColumn( name="nodeid")
)
private Set<Connection> connections;

最好!

关项明
2023-03-14
匿名用户

你必须使连接类也成为一个实体,要在两个实体类之间建立关系,只需将< code>@Entity放在它上面

@Entity
@Table(name="Connection")

public class Connection {  
@ManyToOne()
//this will join the nodeId of ComputerNode entity class to Connection entity class
@JoinColumn(name="nodeId")
private ComputerNode nodeId;

@Column(name="connstatus")     
private String connStatus;

}   

希望这对你有帮助。

潘智刚
2023-03-14

试试这个:

@Entity
@Table(name="ComputerNode")
public class ComputerNode {

@Id
@Column(name="nodeid")
private int nodeId;

@Column(name="nodename")
private String nodeName;

@OneToMany(mappedBy="computerNode")
private Set<Connection> connections;

.... //getter and setters
}

连接:

@Entity
@Table(name="Connection")
public class Connection {

@ManyToOne
@JoinColumn(name="nodeid")
private ComputerNode computerNode;

...
}

如果连接表没有任何主键,请检查此解决方案:Hibernate和不带 PK 的表

===========

已更新

如果要选择ComputerNode实体,请使用以下查询:sessionFactory.getCurrentSession()。createQuery(“从ComputerNode中选择节点作为节点”).list()

 类似资料:
  • 我在hibernate中搜索建立关系的各种可能性,遇到了下面的代码片段

  • 我正在学习冬眠,只是有点困惑。

  • 1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程,你将了解到: 如何实现一对多关联映射; 如何实现双向一对多关联映射; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。 如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。 一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。 数据库中有

  • 1. 前言 本节课,咱们一起继续聊聊多对多关联映射。通过本节课程,你将了解到: 多对多关联映射的实现; 双向多对多关联映射的实现。 2. 多对多关联映射 首先了解表中的多对多关系,学生表中的数据和课程表中的数据就存在多对多关系。 一名学生可以选修多门课程,一门课程可以供多名学生选修。 数据库通过主外键的机制描述表中的数据之间的关系。对于存在多对多关系的数据表,借助于中间表,分拆成两个一对多(或者多

  • 我有两个类:< code>User和< code>UserProfile。 用户类别: 用户配置文件类: 当我使用此代码时,我在具有多对多关系的表用户配置文件中获得重复的实体。我使用 函数来保存对象。我做错了什么? 然后我删除 cascadeType,出现错误:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。 Hibernate日志:

  • 我试图使用Hibernate标准来选择,使用多对多关系中相关的表。n-m表有一些附加列,而不仅仅是每个表的ID。 java.lang.IllegalArgumentException:无法在此ManagedType[User]上找到具有给定名称[UserRolesList.Role]的属性 我已经为这种情况尝试了许多选择,比如加入,但仍然无法使其工作。