11
votes

Plusieurs à plusieurs sur la même table avec des colonnes supplémentaires

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.


0 commentaires

3 Réponses :


2
votes

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
}


0 commentaires

7
votes

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
        }

    }


}


4 commentaires

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é?



1
votes

J'ai eu le même problème. Vous pouvez essayer quelque chose comme ceci: xxx


0 commentaires