【问题标题】:Hibernate - Many to many relationship: relationship table not getting populatedHibernate - 多对多关系:关系表未填充
【发布时间】:2015-09-02 22:59:36
【问题描述】:

我有一个名为 Node 的类,它可以有多个等级。并且一个等级可以与许多节点对象相关联。这么多。 我的注释如下:

@Entity
@Table(name="tbl_nodes")
public class Node {
 //getters setters, constructors.

  private Set<Grade> grades = new HashSet<Grade>();

  @ManyToMany(mappedBy = "nodes")
  public Set<Grade> getGrades() {
    return grades;
  }
}

//这里是年级

@Entity
@Table(name="grades")
public class Grade {
  private Set<Node> nodes;
  // getters, setters, constructors

  @ManyToMany(cascade = CascadeType.ALL)
  @JoinTable(
      name = "node_grade",
      joinColumns = @JoinColumn(name = "grade_id"),
      inverseJoinColumns = @JoinColumn(name = "node_id")
  )
  public Set<Node> getNodes() {
    return nodes;
  }
}

当然,这两个类都有 @Id 注释。例如。对于等级实体,它将是:

  @Id
  @GeneratedValue
  @Column(name="grade_id")
  public int getId() {
    return id;
  }

我的成绩表有 5 行,当与节点对象建立关系时,将引用行的子集。 我正在使用以下查询来创建节点和等级之间的关系。

// loads configuration and mappings
    Configuration configuration = new Configuration().configure();
    ServiceRegistryBuilder registry = new ServiceRegistryBuilder();
    registry.applySettings(configuration.getProperties());
    ServiceRegistry serviceRegistry = registry.buildServiceRegistry();

    // builds a session factory from the service registry
    SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

    // obtains the session
    Session session = sessionFactory.openSession();
    session.beginTransaction();

    // List all grade 
    Query queryAllGrades = session.createQuery("FROM  Grade");
    List<Grade> allGrades = queryAllGrades.list();
    for(Grade grade: allGrades) {
      System.out.println("Grade::" + grade.getName());
    }

// Create a new Node
    Node node = new Node();
    node.addGrade(allGrades.get(0));

    session.save(node);

    session.getTransaction().commit();
    session.close();

但这只会保存节点对象,但不会写入我的表“node_grade”我错过了什么?

即使我尝试保存成绩对象,它也不会保存 node_grade 中的关系。

session.save(allGrades.get(0)); //doesn't save either the node or the node_grade

session.saveOrUpdate(allGrades.get(0)); //doesn't save either the node or the node_grade

可能是什么问题?

【问题讨论】:

    标签: java spring hibernate jpa orm


    【解决方案1】:

    您正在修改关联的反面。 Hibernate 只关心所有者方面。

    Node node = new Node();
    session.save(node);
    allGrades.get(0).addNode(node);
    

    【讨论】:

    • 感激不尽!你让我今天很开心。但是我怎么知道哪一个是“Owner side”——节点有多个等级,等级可以关联多个节点?
    • 反面是mappedBy属性的一面。
    猜你喜欢
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多