2016-12-07 4 views
0

Je ne sais pas comment enregistrer un enregistrement en SDR avec un lien vers une table existante. Par exemple:Spring Data Rest enregistrer enregistrer avec relation (clé étrangère) en Java (repo.save())

Il y a une recherche table Drapeau et une autre table compte avec nom et n: 1 rapport à Drapeau-ID. Les ID dans Flag -table sont déjà créés.

@Entity 
public class Account{ 
    public Account(String name, Flag flag){ 
     this.name = name; 
     this.flag = flag; 
    } 

    @Id 
    private int id; 

    @Column 
    private String name; 

    @ManyToOne 
    private Flag flag; 
    // Getter & Setter 
} 

@Entity 
public class Flag{ 
    public Flag(String title){ 
     this.title = title; 
    } 

    @Id 
    private int id; 

    @Column 
    private String title; 
    // Getter & Setter 
} 

Maintenant, je veux ajouter un compte et de le relier au drapeau-id comme ceci:

AccountRepo accountRepo; 
accountRepo.save(new Account("Name", 0)); 

Mais je déclare un objet dans mon compte-fonction et si je veux exécuter la sauvegarde -fonction, je dois ajouter un drapeau objet comme celui-ci:

accountRepo.save(new Account("Name", new Flag("title"))); 

Cependant, dans ce cas, le cadre ajoutera un nouveau record de drapeau, ce que je ne veux pas. Je veux seulement le lier.

J'ai donc besoin d'aide pour résoudre mon problème.

Merci!

Editer: Les deux réponses de @ piotr-sołtysiak et @ upesh-m ont aidé et travaillé pour moi. Merci de votre aide!

Répondre

1

Vous pouvez utiliser 'fusion' de mise en veille prolongée , c'est à dire. entityManager.merge (nouveau compte ("Nom", nouveau drapeau ("titre"))). Mais l'identifiant du drapeau doit être un identifiant existant, de sorte qu'il ajoute simplement une entrée à compte.

ie. Si vous avez déjà un enregistrement de drapeau existant dans db avec id = 1, et que vous voulez ajouter un compte lié à ce drapeau, utilisez entityManager.merge (new Account ("Name", existingFlagObject)

+0

Ça marche aussi, merci! – Phil

1
  1. Trouver entité désirée flag l'utilisation du référentiel dédié, par exemple

    Flag flag = flagRespository.findByTitle("title"); 
    
  2. Set dans l'entité de compte et enregistrer:

    accountRepo.save(new Account("Name", flag)); 
    
+0

Oui cela fonctionne, merci ! – Phil