Hibernate - 集合的一对多映射 - 注释

Hibernate - One to Many Mapping of Set - Annotations

这里是 Hibernate 的新手。我正在构建一个简单的应用程序来使用 Hibernate,并且我掌握了大部分注释,但映射确实让我感到困惑。

我有一个 Person class 和一个 Note 的 class。一个人可以有许多与之相关的笔记,但一个笔记只会对应于一个特定的人。

我正在尝试设置它,以便 note table 有一个名为 person_id 的列,这样我就不需要额外的 person_note table 在协会的数据库中。

我将如何设置注释,以便不在数据库中创建额外的 table,并且我可以通过 note 中的额外列将多个注释关联到一个人的 table?

我在 Google 上搜索后尝试了一些选项,例如使用这样的注释但没有成功:

@JoinColumn(name="id_person", nullable=false)

人Class

@Entity
@Table(name = "person")
public class Person {

    @OneToMany()
    private Set<Note> notes;

    public Set<Note> getNotes() {
        return notes;
    }

    public void setNotes(Set<Note> notes) {
        this.notes = notes;
    }

    ...

}

备注Class

@Entity
@Table (name = "note")
public class Note {

    @ManyToOne
    private Person person;

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

   ...

}

如有任何帮助,我们将不胜感激。谢谢。


最终工作解决方案

为了未来所有人的利益,我现在没有单独的 table 用于将 note 对象映射到 people 对象。最终代码(删除了多余的行)现在看起来像这样:

人Class

@Entity
@Table(name = "person")
public class Person {

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "person", cascade = CascadeType.ALL)
    private Set<Note> notes;

    ...

}

备注Class

@Entity
@Table (name = "note")
public class Note {

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_person", nullable = false)
    private Person person;

   ...

}

杂项点数

编辑Person

@OneToMany(fetch = FetchType.EAGER , mappedBy = "person")
private Set<Note> notes;

Note

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "person_id", nullable = false)
private Person person;

在您的映射注释中,您应该在 @OneToMany 注释中使用 mappedBy 属性 映射实体,并在 joinColumn @ManyToOne 注释使用 @JoinColumn 注释,像这样更改您的代码:

人class:

@OneToMany(mappedBy = "person") // "person" here refers to the person property in the notes class
private Set<Note> notes;

备注class:

@ManyToOne
@JoinColumn(name = "id_person", nullable = false)
private Person person;

查看 Hibernate Collection mapping 了解更多信息。

我同意你的看法。仅用您已有的两个 table 即可实现您的要求。

这是我会做的:

数据库方面:

Table 人,有: PK栏:person_id

Table 注意,有:

  1. PK栏:note_id
  2. 列:person_id(可为空)
  3. 列:assigned_person_id(可空且具有唯一索引)

目的:

  1. person_id - 参考Persontable的PK。这将定义 [Person : Note] 关系,其中 1 个人可以有多个笔记。

  2. assigned_person_id - 对分配给笔记的人的引用。但是,为了保证您的要求只能将一个人分配给一张便条 - 通过该列添加一个唯一索引。这将保证相同的 person_id 用于另一条笔记记录。

休眠明智:

注意代码片段不完整!它只是指向重要时刻。 您可以查看许多完整示例之一,例如: http://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/

public class Person {

   @OneToMany(fetch = FetchType.LAZY, mappedBy = "person")
   public setNotes(Set<Note> notes) { 
     this.notes=notes;
   }

...          
}

@Table(name = "note", catalog = "schema_name", 
uniqueConstraints = @UniqueConstraint(columnNames = "assigned_person_id"))    
public class Note {    
  private Person person;
  private Person assignedPerson;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "person_id", nullable = false)
  public Person getPerson() {
    return person;
  }

  public Person getAssignedPerson() {
    return assignedPerson;
  }

  ...

}