2012-08-17 199 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

相關問題