with vladmihalcea one many example column additional hibernate mapping many-to-many orm

hibernate - vladmihalcea - spring boot mapping many to many



Muchos a muchos en la misma tabla con columnas adicionales (3)

No estoy seguro de que esto se ajuste a tu caso, pero inténtalo.

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

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.


Yo tuve el mismo problema. Puedes probar 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>


Has dicho

relación de muchos a muchos en la misma mesa

No es una buena idea. Es una pesadilla para mantener.

Prueba este en su 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 } } }

Saludos,