Hibernate - ассоциации один ко многим

1

У меня две таблицы: 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());
 }
}
  • 0
    Вы пробовали аннотацию @Id ..?
  • 0
    @Id только для класса Entity. Но соединение не может быть сущностью, не так ли?
Показать ещё 1 комментарий
Теги:
hibernate

3 ответа

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;

...
}

Если в таблице Connection нет первичного ключа, проверьте это решение: Hibernate и таблица без PK

===========

обновленный

Если вы хотите выбрать объекты ComputerNode, используйте этот запрос: sessionFactory.getCurrentSession().createQuery("select node from ComputerNode as node").list();

  • 0
    я получил ошибку: не указан идентификатор для объекта: org ... Connection. Чтобы класс был сущностью, он должен иметь @Id.
  • 0
    Есть ли у вас первичный ключ в таблице Connection?
Показать ещё 11 комментариев
0

Я не уверен, что вам нужно делать без id.

Может быть, это может помочь...

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

Лучший!

0

Вы должны сделать класс 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;

}   

Надеюсь, что это поможет вам.

  • 0
    nodeId не является первичным ключом
  • 0
    nodeid не является первичным ключом в таблице соединений, в то время как это первичный ключ в таблице ComputerNode
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню