【问题标题】:Hibernate - One to Many Mapping of Set - AnnotationsHibernate - 集合的一对多映射 - 注释
【发布时间】:2015-04-07 16:05:38
【问题描述】:

这里是休眠的新手。我正在构建一个简单的应用程序来使用 Hibernate,并且我掌握了大多数注释的窍门,但映射真的让我感到困惑。

我有一个Person 的班级,我有一个Note 的班级。一个人可以有许多与之关联的笔记,但单个笔记只会对应于特定的人。

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

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

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

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

   ...

}

杂项点

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

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:

    在您的映射注释中,您应该使用@OneToMany 注释中的mappedBy 属性映射实体,并使用@JoinColumn 注释在@ManyToOne 注释下指定一个joinColumn,更改您的代码如下:

    人物类:

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

    笔记类:

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

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

    【讨论】:

    • 这是第一个答案,它有助于整理映射。在保存人时,我必须对其进行一些调整以保存笔记对象,但除此之外,它还有效。我将更新答案以反映最终的工作版本。谢谢。
    【解决方案2】:

    编辑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;
    

    【讨论】:

      【解决方案3】:

      我同意你的看法。只需使用您已有的两张表即可实现您的要求。

      我会这样做:

      数据库方面:

      桌人,有: PK栏目:person_id

      表格注释,附:

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

      目的:

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

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

      休眠方式:

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

      【讨论】:

        猜你喜欢
        • 2015-08-20
        • 2014-09-07
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多