这里是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;
...
}
其他积分
答案 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
表注,用:
目的:
person_id - 引用Person表的PK。这将定义[Person:Note]关系,其中1个人可以有多个笔记。
assigned_person_id - 引用分配给该笔记的人员。但是,为了保证您只需要将一个人分配给一个注释 - 按该列添加唯一索引。这将保证同一个person_id被用于另一个音符记录。
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;
}
...
}