Hibernate - Set的一对多映射 - 注释

时间:2015-04-07 16:05:39

标签: java hibernate hibernate-mapping

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

我有一个Person课程,我有一个Note的课程。一个人可以有许多与他们相关的笔记,但是一个笔记只会对应一个特定的人。

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

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

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

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

人员类

@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;
    }

    ...

}

注意课程

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

    @ManyToOne
    private Person person;

    public Person getPerson() {
        return person;
    }

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

   ...

}

任何帮助将不胜感激。谢谢。


最终工作解决方案

为了将来的任何人的利益,我现在没有单独的表来将note个对象映射到people个对象。最终代码(删除了额外的行)现在看起来像这样:

人员类

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

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

    ...

}

注意课程

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

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

   ...

}

其他积分

  • 我必须在cascade = CascadeType.ALL类中添加Person,以确保在保存Person对象时保存了所有Note个对象。
  • 我合并了chsdkSaif的代码。谢谢你们俩。

3 个答案:

答案 0 :(得分:2)

在地图注释中,您应该在mappedBy注释中使用@OneToMany属性映射实体,并使用{@ManyToOne注释指定 joinColumn {1}}注释,更改代码如下:

人员类:

@JoinColumn

笔记课程:

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

请查看Hibernate Collection mapping以获取更多信息。

答案 1 :(得分:1)

修改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;

答案 2 :(得分:0)

我同意你的看法。你可以用你已经拥有的两个表来实现你所要求的。

以下是我要做的事情:

数据库明智:

表人,有:  PK栏:person_id

表注,用:

  1. PK栏:note_id
  2. 专栏:person_id(可空)
  3. 列:assigned_person_id(可以使用唯一索引为空)
  4. 目的:

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

    2. assigned_person_id - 引用分配给该笔记的人员。但是,为了保证您只需要将一个人分配给一个注释 - 按该列添加唯一索引。这将保证同一个person_id被用于另一个音符记录。

    3. Hibernate明智:

      注意代码段不完整!它只是指出重要的时刻。 您可以查看众多完整示例中的一个,例如: 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;
        }
      
        ...
      
      }