2017-10-03 4 views
0

Je pense qu'il est plus facile de l'expliquer que de poser une question. Je ne peux pas trouver la formule pour faire ce qui suit:Est-il possible d'utiliser un objet Spring dans un ensemble et comme attribut en même temps?

Imaginez que nous ayons un objet PHOTO. D'une part, nous avons un objet NEWS qui a un objet PHOTO avec une relation @OneToOne. D'un autre côté, nous avons un objet PROFILE qui a un attribut avatar qui est un objet PHOTO, également avec une relation @OneToOne. En même temps, je veux que le PROFILE ait un objet ALBUM, qui est un ensemble d'objets PHOTO avec une relation @OneToMany. Hibernate ne me laisse pas partager les relations @OneToOne et @OneToMany sur le même objet PHOTO

Je pense qu'il ne peut pas utiliser la même table pour enregistrer un objet PHOTO dans une relation @OneToOne et @OneToMany en même temps.

Quelqu'un peut-il me expliquer pourquoi ou une autre façon de résoudre le problème ....

Merci

+0

Vous ne savez pas si c'est la réponse, mais Hibernate sera parfois indulgent si vous avez updatable = false et insertable = false. De cette façon, vous pouvez avoir une relation primaire, mais d'autres façons d'arriver au même objet. – JustinKSU

+0

Je mettrais en question la validité de '@ OneToOne'. Dans les scénarios de la vie réelle, les relations en tête-à-tête sont vraiment rares, en particulier entre des objets totalement indépendants tels que des photos, des profils et des articles de presse. Dans votre cas, je crois que la même photo peut être affectée à un article de presse ainsi qu'à un profil, de sorte qu'elle ne peut pas avoir de relation bi-univoque avec l'un ou l'autre. Le test décisif pour une relation un-à-un est de savoir si deux objets doivent toujours partager la même clé primaire qui n'est partagée avec rien d'autre; alors et seulement alors sont-ils one-to-one. Dans la plupart des cas, la relation correcte est en fait '@ ManyToOne'. – manish

+0

Qu'est-ce qu'un "objet ressort"? – DN1

Répondre

0

Si vous souhaitez utiliser une entité Photo dans différentes entités puis garder l'entité indépendante et Photo magasin toute relation dans l'entité qui utilise l'entité Photo ou dans une table de mappage. Dans votre cas, vous pouvez utiliser la structure suivante.

class Profile { 

    @oneToOne 
    @JoinColumn(name="avatar") 
    Photo avatar; 

    @OneToMany 
    @JoinTable(name="profile_album",[email protected](name="profile_id"),[email protected](name="photo_id")) 
    Set<Photo> album; 
} 

Votre structure de tableau ressemblera à ceci.

photo - id, ... 
profile - id, avatar (references photo id), ... 
profile_album - profile_id, photo_id // mapping table 
+0

Merci Wolverine. C'est l'annotation correcte. Savez-vous où puis-je en savoir plus sur ce type d'annotations (reverseJoinColumns)? –

+0

@ JorgeM.Nures Lire le [guide de l'utilisateur] (http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html) – wolverine