J'ai un utilisateur de classe. Un utilisateur peut être un ami avec de nombreux autres utilisateurs. La relation est mutuelle. Si A est un ami de B, alors B est un ami de A. Je souhaite également que chaque relation stocke des données supplémentaires - par exemple la date à laquelle deux utilisateurs sont devenus amis. Il s'agit donc d'une relation nombreuses à plusieurs sur la même table avec des colonnes supplémentaires. Je sais qu'une amitié de la classe moyenne doit être créée (contenant deux ID utilisateur et colonne pour la date). Mais je viens de mapper cela avec hibernate. La chose qui m'arrête est que la cartographie est à la même table. Je peux le résoudre, si la relation plusieurs à plusieurs était entre deux tables différentes. P>
3 Réponses :
Je ne suis pas sûr que cela correspondra à votre cas, mais essayez-le.
@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 }
Vous avez dit
relation beaucoup à plusieurs
sur la même table forte> p> blockQuote> Ce n'est pas une bonne idée. C'est un cauchemar à maintenir. P>
Essayez celui-ci à la place p>
@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 } } }
Merci pour votre réponse. Mais j'ai une question. Pourquoi "Insérable = False" est-il mis dans les relations @manytoOne? Si je le supprime, cela fonctionne. Sinon, les myonniers ne sont pas correctement persistants. Je ne suis pas un expert en hibernation, alors je ne comprends probablement pas quelque chose.
Ok, je l'ai eu, je n'ai pas utilisé d'intégré comme vous, mais juste une autre colonne d'identification. Vous avez mis l'insertable = false parce que l'encludeDded s'occupe de cela. Votre réponse est acceptée :)
Vous avez remarqué pourquoi. Lorsque deux propriétés partagent la même colonne, il est judicieux de mettre des paramètres à ce sujet dans une seule propriété. Sinon, Hibernate se plaint des erreurs.
Bonjour, j'ai lu votre message. J'ai une question, où je peux trouver un script SQL pour cartographier ces classes d'entité?
J'ai eu le même problème. Vous pouvez essayer quelque chose comme ceci: