2012-08-17 200 views
4

我在做一个简单的Poll系统。我有2个表:org.hibernate.MappingException:实体映射中的重复列

Person:ID,姓名,姓

Vote:身份证,投票(布尔),VoterID(这实际上是FK_PersonID),是PersonID(这实际上是FK_PersonID为好)。

我需要能够识别谁投投票以及谁投票是为 - 使用存储在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(应映射 与插入件= “假” 更新= “假”)

回答

10

您对选民和个人使用相同的@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布尔型右侧表示向上/向下投票。

1

异常的原因是下面的一段代码,并且您与投票实体的两次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; 
} 
+0

我需要有两次关系,因为一个'Voter'可以** **投票以及成为**投票** – ThreaT 2012-08-17 09:04:47

+1

他解释说,在这个问题,投票包含有关谁投赞成票的persone信息以及被投票的人 – Less 2012-08-17 09:05:01

相关问题