【问题标题】:Hibernate - One to Many associationsHibernate - 一对多关联
【发布时间】:2015-01-26 20:42:50
【问题描述】:

我有两个表,ComputerNode 和 Connection。 ComputerNode 有一个主键 nodeid 但 Connection 没有主键。我无法修改表架构。如果它们具有一对多的关系,我应该如何创建 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 类,但我不确定所需的注释。我已经阅读了休眠教程,但我没有看到没有标识符的类的解释(即:连接)。

ComputerNode.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;
}

Connection 应该是什么类型的类? @可嵌入? 我应该怎么做才能在两个类之间建立一对多的关系?

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

更新

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());
 }
}

【问题讨论】:

  • 你试过@Id注解吗?
  • @Id 仅适用于实体类。但是连接不能是实体可以吗?
  • 连接应该只是实体。我认为您在 Connection Entity 类中使​​用 @Id 的那一列应该有外键。

标签: java hibernate


【解决方案1】:

试试这个:

@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 and table without PK

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

更新

如果您想选择 ComputerNode 实体,请使用以下查询: sessionFactory.getCurrentSession().createQuery("select node from ComputerNode as node").list();

【讨论】:

  • 我收到一个错误:没有为实体指定标识符:org...Connection。对于要成为实体的类,它必须具有@Id。
  • 连接表有主键吗?
  • 连接表没有主键。我不能添加一个,因为我不允许修改架构
  • 好的,我将@Id 设置为 Connection 中的多个属性。但我得到了预期加入的路径
  • 连接使用实体之间的关联。检查连接表是实体。请更新您的代码。
【解决方案2】:

如果没有id,我真的不确定你要做什么。

也许这会有所帮助...

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

最好的!

【讨论】:

    【解决方案3】:

    你必须让 Connection 类也成为一个实体,为了让你在两个实体类之间建立关系,只需将@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;
    
    }   
    

    希望这会对你有所帮助。

    【讨论】:

    • nodeid 不是 Connection 表中的主键,而是 ComputerNode 表中的主键
    • 我编辑了我的答案,请解释为什么投反对票,以便我可以提前修复它 tnx
    • 现在我看到我的答案与@Pavel 的答案相同-_-。对我来说很好尝试:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多