У меня две таблицы: ComputerNode и Connection. У ComputerNode есть первичный ключ nodeid
но Connection его нет. Я не могу изменить схему таблицы. Как я должен создать java POJO, если они должны иметь отношения "один ко многим"? в основном моя цель - сделать внутреннее соединение следующим образом:
select * from 'ComputerNode' cn inner join 'Connection' c on cn.nodeid = c.nodeid
Вот схема таблицы SQL. Таблица ComputerNode:
int nodeid <primary key>;
varchar nodename;
Таблица подключения:
int nodeid <not primary key>;
varchar connstatus;
Связь между таблицами - один-ко-многим. Узел компьютера может иметь много соединений
Я создал два класса Java POJO, но я не совсем уверен в требуемых аннотациях. Я прочитал учебник гибернации, но я не вижу объяснений по классу без идентификатора (т.е. Connection).
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? @Embeddable? Что мне делать, чтобы создать отношения "один ко многим" между этими двумя классами?
================
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());
}
}
Попробуй это:
@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;
...
}
Если в таблице Connection нет первичного ключа, проверьте это решение: Hibernate и таблица без PK
===========
обновленный
Если вы хотите выбрать объекты ComputerNode, используйте этот запрос: sessionFactory.getCurrentSession().createQuery("select node from ComputerNode as node").list();
Я не уверен, что вам нужно делать без id
.
Может быть, это может помочь...
@OneToMany (cascade = {CascadeType.ALL})
@JoinTable(
name="Connection",
joinColumns = @JoinColumn( name="nodeid")
)
private Set<Connection> connections;
Лучший!
Вы должны сделать класс 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;
}
Надеюсь, что это поможет вам.
@Id
..?