Tengo un usuario de clase. Un usuario puede ser un amigo con muchos otros usuarios. La relación es mutua. Si A es amigo de B, B es amigo de A. También quiero que cada relación almacene datos adicionales, por ejemplo, la fecha en que dos usuarios se hicieron amigos. Así que esta es una relación de muchos a muchos en la misma tabla con columnas adicionales. Sé que se debe crear una Amistad de clase media (que contenga dos identificadores de usuario y una columna para la fecha). Pero me estoy quedando corto al mapear esto con Hibernate. Lo que me detiene es que la asignación es a la misma tabla. Puedo resolverlo, si la relación de muchos a muchos estaba entre dos tablas diferentes.Many-to-many en la misma tabla con columnas adicionales
10
A
Respuesta
7
Usted ha dicho
muchos-a-muchos relación en la misma mesa
No es una buena idea. Es una pesadilla para mantener.
Prueba este lugar
@Entity
public class Friend {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer friendId;
@Column
private String name;
@OneToMany(mappedBy="me")
private List<MyFriends> myFriends;
}
@Entity
public class MyFriends {
@EmbeddedId
private MyFriendsId id;
@Column
private String additionalColumn;
@ManyToOne
@JoinColumn(name="ME_ID", insertable=false, updateable=false)
private Friend me;
@ManyToOne
@JoinColumn(name="MY_FRIEND_ID", insertable=false, updateable=false)
private Friend myFriend;
@Embeddable
public static class MyFriendsId implements Serializable {
@Column(name="ME_ID", nullable=false, updateable=false)
private Integer meId;
@Column(name="MY_FRIEND_ID", nullable=false, updateable=false)
private Integer myFriendId;
public boolean equals(Object o) {
if(o == null)
return false;
if(!(o instanceof MyFriendsId))
return false;
MyFriendsId other = (MyFriendsId) o;
if(!(other.getMeId().equals(getMeId()))
return false;
if(!(other.getMyFriendId().equals(getMyFriendId()))
return false;
return true;
}
public int hashcode() {
// hashcode impl
}
}
}
respecto,
2
No estoy seguro de que esto se ajuste a su caso, pero pruébelo.
@Entity
public class Friend {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int friendId;
@Column
private String name;
@ManyToMany(mappedBy="owner")
private List<Friendship> friendships;
}
@Entity
public class Friendship {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int friendshipId;
@OneToOne
private Friend owner;
@OneToOne
private Friend target;
// other info
}
1
que tenían el mismo problema. Puede intentar algo como esto:
<class name="Friend" entity-name="RelatedFriend" table="FRIENDS">
<id name="id" type="long">
<generator class="native" />
</id>
<!-- *** -->
<set name="relatedFriends" table="RELATED_FRIENDS">
<key column="FRIEND_ID" />
<many-to-many column="RELATED_FRIEND_ID" class="Friend" entity-name="RelatedFriend"/>
</set>
</class>
Cuestiones relacionadas
- 1. SQLAlchemy Tabla secundaria ManyToMany con campos adicionales
- 2. Relación ManyToMany de Django con campos adicionales
- 3. Crear una tabla basada en algunas columnas de otra tabla, sino también añadir algunas columnas adicionales
- 4. Seleccionar valores distintos de varias columnas en la misma tabla
- 5. ¿Cómo comparo dos columnas en la misma tabla?
- 6. unir la misma tabla dos veces en diferentes columnas
- 7. ¿Cómo seleccionar dos columnas adicionales de otra tabla basadas en valores en la tabla principal?
- 8. ¿Puede agregar campos adicionales a la tabla extra de @ManyToMany Hibernate?
- 9. Fluido NHibernate genera columnas adicionales
- 10. 2 entidades JPA en la misma tabla
- 11. linq a sql: unir varias columnas de la misma tabla
- 12. ¿Es posible contar con dos columnas en la misma consulta
- 13. tabla de unión con columnas adicionales en Código CTP4 EF4 Primera
- 14. Actualice la misma tabla en SQL Server
- 15. ¿Cómo selecciono todas las columnas de una tabla, más columnas adicionales como ROWNUM?
- 16. recuento simple del número de registros en la tabla ManyToMany
- 17. Kohana 3.0.x ORM: Leer columnas adicionales en tablas dinámicas
- 18. En PostgreSQL, ¿es más rápido incluir columnas TEXT en la misma tabla, en lugar de una tabla separada?
- 19. Buscar duplicados en la misma tabla en MySQL
- 20. Relación en la misma tabla con Entity Framework
- 21. Unir mesa dos veces: en dos columnas diferentes de la misma tabla
- 22. R: Fusión de filas en la misma tabla de datos, concatenando ciertas columnas
- 23. Realizar una unión interna para múltiples columnas en la misma tabla
- 24. Eliminar declaración en la misma tabla
- 25. Columnas no seleccionables en la tabla HTML
- 26. NHibernate QueryOver con ManytoMany
- 27. @ManyToMany sin tabla de unión (base de datos heredada)
- 28. ¿Cómo ocultar columnas en la tabla HTML?
- 29. Ocultar columnas en la tabla JavaScript
- 30. Varias columnas en la vista de tabla
Gracias por su respuesta. Pero tengo una pregunta. ¿Por qué se inserta "insertable = false" en las relaciones @ManyToOne? Si lo elimino, entonces funciona. De lo contrario, MyFriends no se conserva correctamente. No soy un experto en Hibernate, entonces probablemente no entiendo nada. –
Ok, no he usado un EmbeddedId como tú, sino solo otra columna de identificación. Has puesto el insertable = falso porque EmbeddedId se ocupa de él. Su respuesta es aceptada :) –
Ha notado por qué. Cuando dos propiedades comparten la misma columna, es una buena idea poner las configuraciones al respecto en una sola propiedad. De lo contrario, Hibernate se quejará de algunos errores. –