org.hibernate.MappingException:实体映射中的重复列 [英] org.hibernate.MappingException: Repeated column in mapping for entity

查看:144
本文介绍了org.hibernate.MappingException:实体映射中的重复列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Person :ID,姓名,姓氏



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



我需要能够识别 投票以及投票结果 - 使用存储在 Person 这些需求。表 Person 包含可以投票以及投票的用户的用户详细信息。人们可以决定是否为自己投票。



我在我的域中映射了我的表这样的对象:

Person

 私人整数ID; 
私人字符串名称;
私人字符串姓氏;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name =ID)
public Integer getID(){
返回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;
}

投票 $ b

 私人整数ID; 
私人选民;
私人人物;
私人布尔投票;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name =ID)
public Integer getID(){
返回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(应映射
with insert =falseupdate =false)


解决方案

对于选民和人来说,相同的 @JoinColumn 。更改为相关人员的 @JoinColumn(personID),并为相关投票人更改为 @JoinColumn(voterID),所有的都应该没问题。

作为一个附注,因为你用 domain-driven-design 标记了这个...如果以这种方式实施,您的投票类将更多DDD风格:

  @Id 
@GeneratedValue(strategy = GenerationType。 AUTO)
@Column(name =ID)
私人整数ID;

@ManyToOne
@JoinColumn(name =voterID)
私人投票人;

@ManyToOne
@JoinColumn(name =votedForID)
private Person votedFor;

@Column(name =vote)
私人布尔投票;

public void cast(Person voter,Person votedFor,boolean vote){
//可能声称这个投票还没有被投票
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;
}

只是一个例子,不知道我是否明白了投票布尔右键表示上/下投票。

I am doing a simple Poll system. I have 2 tables:

Person: ID, Name, Surname

Vote: ID, Vote (Boolean), VoterID (This is actually FK_PersonID), PersonID (This is actually FK_PersonID as well).

I need to be able to identify who cast the vote as well as who the vote was for - using the people stored in the Person table for both of these needs. The table Person contains user details of people that can "Vote" as well as be "Voted for". People are allowed to decide whether they want to vote for themselves or not.

I've mapped out my tables in my domain objects like this:

Person

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

Vote

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

Error message

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: web.poll.domain.Vote column: personID (should be mapped with insert="false" update="false")

解决方案

You use the same @JoinColumn for voter and person. Change to @JoinColumn("personID") for associated person and @JoinColumn("voterID") for associated voter and all should be fine.

As a side note because you tagged this with domain-driven-design... Your vote class would be more DDD style if implemented like this:

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

Just an example, don't know if I got the meaning of your vote boolean right to indicate an up/down vote.

这篇关于org.hibernate.MappingException:实体映射中的重复列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆