2017-04-03 6 views
2

Je suis incapable d'effectuer CRUD via json POST du client reposant Postman sur la table composite ayant la colonne supplémentaire .J'utilise Spring boot, repos de données de printemps et printemps JPA. J'ai 3 tables dans la base de données
-user
-competency
-user_competency (joindre/tableau composite avec colonne supplémentaire)
enter image description here
Voici mes coursRessort Données repos comment effectuer CRUD sur la relation @manytomany, table composite avec la colonne supplémentaire

utilisateur

@Entity 
@Table(name = "\"user\"", schema = "public") 
@JsonIdentityInfo(
      generator = ObjectIdGenerators.IntSequenceGenerator.class, 
      property = "userId") 
public class User implements java.io.Serializable { 

    private Long userId; 

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 

    @Column(name = "user_id", unique = true, nullable = false) 
    public Long getUserId() { 
     return this.userId; 
    } 

    public void setUserId(Long userId) { 
     this.userId = userId; 
    } 

    private Set<UserCompetency> userCompetencies = new HashSet<UserCompetency>(0); 

     @OneToMany(fetch = FetchType.EAGER,cascade = {CascadeType.ALL}, mappedBy = "user") 
    public Set<UserCompetency> getUserCompetencies() { 
     return this.userCompetencies; 
    } 

    public void setUserCompetencies(Set<UserCompetency> userCompetencies) { 
     this.userCompetencies = userCompetencies; 
    } 

} 

Compétence

@Entity 
@Table(name = "competency", schema = "public") 
@JsonIdentityInfo(
      generator = ObjectIdGenerators.IntSequenceGenerator.class, 
      property = "competencyId") 
public class Competency implements java.io.Serializable { 


    private Long competencyId; 
    private Set<UserCompetency> userCompetencies = new HashSet<UserCompetency>(0); 

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 

    @Column(name = "competency_id", unique = true, nullable = false) 
    public Long getCompetencyId() { 
     return this.competencyId; 
    } 

    public void setCompetencyId(Long competencyId) { 
     this.competencyId = competencyId; 
    } 

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "competency") 
    public Set<UserCompetency> getUserCompetencies() { 
     return this.userCompetencies; 
    } 

    public void setUserCompetencies(Set<UserCompetency> userCompetencies) { 
     this.userCompetencies = userCompetencies; 
    } 
} 

UserCompetency

@Entity 
@Table(name = "user_competency", schema = "public") 
@JsonIdentityInfo(
      generator =ObjectIdGenerators.IntSequenceGenerator.class, 
      property = "id") 
public class UserCompetency implements java.io.Serializable { 
    private UserCompetencyId id; 
    private Level level; 
    private User user; 
    private Competency competency; 

    @EmbeddedId 

    @AttributeOverrides({ 
      @AttributeOverride(name = "competencyId", column = @Column(name = "competency_id", nullable = false)), 
      @AttributeOverride(name = "userId", column = @Column(name = "user_id", nullable = false)) }) 
    public UserCompetencyId getId() { 
     return this.id; 
    } 

    public void setId(UserCompetencyId id) { 
     this.id = id; 
    } 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "level_id") 
    public Level getLevel() { 
     return this.level; 
    } 

    public void setLevel(Level level) { 
     this.level = level; 
    } 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "user_id", nullable = false, insertable = false, updatable = false) 
    public User getUser() { 
     return this.user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    @ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL) 
    @JoinColumn(name = "competency_id", nullable = false, insertable = false, updatable = false) 
    public Competency getCompetency() { 
     return this.competency; 
    } 

    public void setCompetency(Competency competency) { 
     this.competency = competency; 
    } 
} 

UserCompetencyId

@Embeddable 
public class UserCompetencyId implements java.io.Serializable { 

    private Long competencyId; 
    private Long userId; 

    public UserCompetencyId() { 
    } 

    public UserCompetencyId(Long competencyId, Long userId) { 
     this.competencyId = competencyId; 
     this.userId = userId; 
    } 


    @Column(name = "competency_id", nullable = false) 
    public Long getCompetencyId() { 
     return this.competencyId; 
    } 

    public void setCompetencyId(Long competencyId) { 
     this.competencyId = competencyId; 
    } 

    @Column(name = "user_id", nullable = false) 
    public Long getUserId() { 
     return this.userId; 
    } 

    public void setUserId(Long userId) { 
     this.userId = userId; 
    } 

    public boolean equals(Object other) { 
     if ((this == other)) 
      return true; 
     if ((other == null)) 
      return false; 
     if (!(other instanceof UserCompetencyId)) 
      return false; 
     UserCompetencyId castOther = (UserCompetencyId) other; 

     return (this.getCompetencyId() == castOther.getCompetencyId()) && (this.getUserId() == castOther.getUserId()); 
    }  
} 

Supposons que je l'ai déjà enregistrer dans les tableaux de l'utilisateur et la compétence et je veux assocaite à la fois que je suis en train de poster comme celui-ci , mais il me donne l'erreur de 405 Méthode non autorisée.

enter image description here aide nécessaire, ce qui devrait être la structure de JSON à l'utilisateur affiché sera déjà exister et la compétence sera peut exister ou nouveau peut être ajouté et associé à l'utilisateur existant.

Répondre

1

Avec ce code j'ai pu poster une nouvelle relation:

UserCompetency.class

@Entity 
@Table(name = "user_competency") 
@IdClass(UserCompetencyId.class) 
public class UserCompetency implements java.io.Serializable { 

    @Id @ManyToOne 
    @JoinColumn(name = "competency_id", nullable = false, insertable = false, updatable = false) 
    private Competency competency; 

    @Id @ManyToOne 
    @JoinColumn(name = "user_id", nullable = false, insertable = false, updatable = false) 
    private User user; 

UserCompetencyId.class

public class UserCompetencyId implements java.io.Serializable { 

    private Long competency; 

    private Long user; 

    public UserCompetencyId() { 
    } 

    public UserCompetencyId(Long competency, Long user) { 
     this.competency = competency; 
     this.user = user; 
    } 

UserCompetencyRepository.classe

public interface UserCompetencyRepository extends JpaRepository<UserCompetency, UserCompetencyId> { 

} 

POSThttp://localhost:8080/userCompetencies

{ 
    "competency": "/competencies/2" 
    , "user": "/user/4" 
} 
+0

Les données sont sauvegardées dans la table composite, mais ma classe UserCompetency a une autre propriété, donc j'ai une autre colonne dans la table ie level_id, qui est également la clé étrangère, donnée en question sur le shoot écran, merci de le regarder et maintenant comment dois-je publier l'ID de niveau dans json post private UserCompetencyId id; \t privé Niveau de niveau; \t privé Utilisateur utilisateur; \t Compétence de compétence privée; – Taimur

+1

Ajout de '," niveau ":"/niveau/123 "'? – KLHauser

+0

ok je l'ai, en fait la classe de dépôt n'a pas été exposée pour le niveau et le problème face, une chose de plus que je dois demander est que, si j'ai un utilisateur existant et je veux ajouter une nouvelle compétence à l'utilisateur existant dans 1 aller via json post, comment je vais le faire. – Taimur

0

Apparemment, il semble y avoir aucun moyen "naturel/facile" pour obtenir ce que vous voulez. Mais il y a un projet prometteur pour l'intégration intégrables en élargissant le processus de sérialisation: https://github.com/gregturn/embeddable-spring-data-rest

  • UserCompetencyIdJacksonModule, UserCompetencyIdSerializer, ..

alors vous devriez être en mesure PATCH (non POST) votre JSON d'en haut.

+0

Je télécharger ce projet et a essayé de reproduire même les changements, je suis tombé sur un problème lorsque j'utilise @import (RepositoryRestMvcConfiguration.class) sur la classe principale, les points d'extrémité api ne sont pas accessibles et quand j'accède à http: // localhost: 8080/api cela donne 404 erreur non trouvée – Taimur

+0

Le 'RepositoryRestMvcConfiguration' ne serait pas nécessaire je pense. Mais les autres choses ne vous aident pas non plus. J'ai donc ajouté une nouvelle réponse .. L'autre problème que nous avons eu la semaine dernière .. Où vous avez pu le résoudre? – KLHauser

+0

thanks.that problème que j'ai résolu en mettant en application la fonction de contrôleur personnalisée. – Taimur