org.hibernate.MappingException:实体映射中的重复列

我正在做一个简单的民意调查系统。 我有2张桌子:

Person :身份证,姓名,姓氏

Vote :ID,投票(布尔),VoterID(实际上是FK_PersonID ),PersonID(这实际上FK_PersonID )。

我需要能够识别投票以及投票的对象 – 使用存储在Person表中的Person满足这些需求。 表Person包含可以“投票”以及“投票”的人的用户详细信息。 人们可以决定是否要为自己投票。

我在我的domain对象中映射了我的表,如下所示:

  private Integer ID; private String name; private String surname; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ID") public Integer getID() { return ID; } public void setID(Integer ID) { this.ID = ID; } @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name = "surname") public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } 

投票

 private Integer ID; private Person voter; private Person person; private Boolean vote; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ID") public Integer getID() { return ID; } public void setID(Integer ID) { this.ID = ID; } @Column(name = "vote") public Boolean getVote() { return vote; } public void setVote(Boolean vote) { this.vote = vote; } @ManyToOne @JoinColumn(name = "personID") public Person getVoter() { return voter; } public void setVoter(Person voter) { this.voter = voter; } @ManyToOne @JoinColumn(name = "personID") public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } 

错误信息

引起:org.hibernate.MappingException:实体映射中的重复列:web.poll.domain.Vote列:personID(应使用insert =“false”update =“false”映射)

你对选民和人使用相同的@JoinColumn 。 更改为关联人员的@JoinColumn("personID")和相关选民的@JoinColumn("voterID") ,一切都应该没问题。

作为旁注,因为您使用domain-driven-design标记了这一点…如果像这样实现,您的投票类将更具DDD风格:

 @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ID") private Integer ID; @ManyToOne @JoinColumn(name = "voterID") private Person voter; @ManyToOne @JoinColumn(name = "votedForID") private Person votedFor; @Column(name = "vote") private Boolean vote; public void cast(Person voter, Person votedFor, boolean vote) { // Maybe assert that this vote has not already been casted this.voter = voter; this.votedFor = votedFor; this.vote = vote; } public Integer getID() { return ID; } public Boolean isUpVote() { return vote; } public Boolean isDownVote() { return !vote; } public Person getVoter() { return voter; } public Person getVotedFor() { return votedFor; } 

举个例子,不知道我是否得到了你的vote布尔权的含义来指示上/下投票。

exception的原因是下面的代码片段,并且您与Vote实体的Person实体有两次关系。 为什么你需要两次关系?

  @ManyToOne @JoinColumn(name = "personID") public Person getVoter() { return voter; } public void setVoter(Person voter) { this.voter = voter; } @ManyToOne @JoinColumn(name = "personID") public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; }