update - hibernate java ejemplo
org.hibernate.MappingException: columna repetida en el mapeo de la entidad (2)
El motivo de la excepción es el fragmento de código que se muestra a continuación, y usted tiene relación con la entidad Person dos veces de la entidad Vote. ¿Por qué necesitas tener una relación dos veces?
@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;
}
Estoy haciendo un simple sistema de encuesta. Tengo 2 tablas:
Person
: ID, nombre, apellido
Vote
: ID, Voto (booleano), VoterID (Esto es en realidad FK_PersonID
), PersonID (Esto es en realidad FK_PersonID
también).
Necesito poder identificar quién emitió el voto así como también para quién era el voto : usar las personas almacenadas en la tabla Person
para estas dos necesidades. La tabla Person
contiene detalles de usuarios de personas que pueden "votar" y ser "votados". Las personas pueden decidir si quieren votar por sí mismos o no.
He trazado mis tablas en mis objetos de domain
esta manera:
Persona
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;
}
Votar
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;
}
Mensaje de error
Causado por: org.hibernate.MappingException: columna repetida en el mapeo de la entidad: web.poll.domain.Vote column: personID (debe correlacionarse con insert = "false" update = "false")
Utiliza el mismo @JoinColumn
para votante y persona. Cambie a @JoinColumn("personID")
para la persona asociada y @JoinColumn("voterID")
para el votante asociado y todo estará bien.
Como nota al margen porque etiquetaste esto con domain-driven-design
... Tu clase de votación sería más estilo DDD si se implementara así:
@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;
}
Solo un ejemplo, no sé si obtuve el significado de su vote
booleano correcto para indicar un voto arriba / abajo.