with update should repeated mapped for false ejemplo column java hibernate database-design domain-driven-design

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.