2017-10-09 4 views
0

J'essaye de créer essentiellement une instruction UPDATE sur une entrée de ma base de données MySQL créée via Hibernate dans une application Spring Boot, et je n'ai pas réussi à trouver comment faites ceci dans cette route par des recherches de google.Mise à jour d'une entrée de référentiel Hibernate après l'enregistrement initial dans Spring Boot

J'ai une entité qui génère un ID de clé primaire automatiquement une fois qu'il est d'abord sauvé par son CrudRepository:

@Entity 
@Table(name = "all_contacts") 
public class Contact { 


    private BigInteger userId; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="contactid") 
    private BigInteger contactId; 

    @NotNull 
    private String name; 

    private String imgPath; 

    // getters and setters 

} 

Voici son CRUDRepository utilisé comme DAO:

public interface ContactRepository extends CrudRepository<Contact, Long> { } 

Alors ce que je want est imgPath est laissé vide lorsque je fais la sauvegarde initiale de l'entité dans le contrôleur:

// within the controller 
@Autowired 
ContactRepository contactDAO; 

public void saveContact(SomeDTO dto) { 
    Contact contact = //... fields set and initialized 
    contactDao.save(contact); 
    BigInteger contactId = contact.getContactId(); 
    // do something here to save and set contact's imgPath in the DB 
} 

Donc ce que je veux faire, c'est maintenant que le champ contactId a été généré. Est récupérer le contactId et utiliser Hibernate pour réaliser ce qui serait essentiellement une déclaration UPDATE afin que je puisse mettre cette ligne dans la colonne SQL imgPath à quelque chose comme /savedir/contactImgId123456

Alors, dites le contactID généré était: 12 345, essentiellement l'instruction SQL J'essaye alors d'exécuter serait: UPDATE all_contacts SET imgpath = '/savedir/contactImgId123456' WHERE contactid = 12345;

Je ne sais pas si c'est faisable, mais si c'est le cas, comment ferais-je cela?

Répondre

1

Vous pouvez le faire avec deux sauvegardes.

Première:

contactDao.save(contact); 

chemin de l'image deuxième set:

contact.setImgpath('/savedir/contactImgId'+contact.getId()); 
contactDao.save(contact); 
+0

Oh sympa! J'ai regardé autour de plus, et mettre à jour ceci après avoir dit que cela a été fait, ce serait similaire à l'utilisation de la méthode findOne(), comme 'Contact oldContact = findOne (12345)', correct? Donc, est-ce que la transaction n'est pas vraiment engagée jusqu'à ce que l'objet soit fermé ou quelque chose? – NateH06

0

En botte de printemps, vous pouvez essayer des données de printemps JPA. Après avoir enregistré l'objet, l'objet sera en état persistant. Lorsque vous mettez à jour l'attribut de l'objet, si la session n'est pas fermée, jpa ou hibernate mettra automatiquement à jour la base de données. Donc, vous pouvez faire ce que vous voulez dans la classe de service, et la transaction de configuration

+0

Veuillez inclure un extrait de code qui illustre le problème que vous tentez de résoudre. –