web-dev-qa-db-fra.com

Créer un nouvel objet entité dans Spring Boot

J'espère que quelqu'un pourrait faire la lumière sur ma confusion avec les entités JPA dans un projet Spring Boot. J'ai entendu dire qu'il ne fallait jamais appeler new dans un projet Spring. Je comprends que cela permet à Spring de gérer tous les beans, et obtenir un bean peut être fait par injection ou via le contexte d'application de manière explicite.

Cependant, je ne sais pas comment obtenir une nouvelle entité JPA. Si j'ai une classe annotée avec @Entity et une classe de référentiel qui gère mon accès aux données, comment puis-je obtenir un nouvel objet entité dans ma couche de service?

J'ai inclus @EntityScan dans la classe principale de mon application, je suppose donc que Spring connaît l'entité. Mais lorsque j'essaie de l'obtenir via ApplicationContext, une exception est déclenchée. Cela a du sens parce que je ne crois pas que le @Entity les classes annotées sont Spring Beans, et je ne pense pas qu'il serait correct de l'annoter également avec @Component. Toute clarification serait grandement appréciée.

J'utilise actuellement le mot clé new et je crée moi-même les objets entité dans la couche service. Un exemple très simple est ci-dessous:

entités/User.Java

@Entity
@Table(name = "users")
public class User {
    @Id
    private Long id;
    private String username;

    // Getters & Setters ...
}

repositories/UserRepository.Java

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    User findByUsername(String username);
}

services/UserServiceImpl.Java

@Service
public class UserServiceImpl implements UserService {
    UserRepository userRepository;

    @Autowired
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void createAndSaveUser(String username) {
        User user = new User();
        user.setUsername(username);

        userRepository.save(user);
    }
}

Et nous pourrions supposer qu'il y avait d'autres classes de contrôleurs qui utiliseraient la couche de service.

Dans cet exemple, j'appelle explicitement le mot clé new dans la méthode de classe de service createAndSaveUser. Est-ce la bonne façon de le faire ou devrais-je obtenir un bean prototype de Spring qui mappe vers mon entité JPA?

4
Jon Catanio

Au printemps, vous pouvez câbler/injecter automatiquement vos beans, composants ou services. Cependant, l'entité ne doit pas être câblée automatiquement car ces interactions se font via votre référentiel. Votre référentiel peut être câblé automatiquement.

Lorsque vous souhaitez créer une nouvelle instance de votre entité, vous êtes autorisé à appeler new, car cela n'a pas besoin d'être géré au printemps. Vous pouvez simplement utiliser le référentiel auto-câblé pour l'enregistrer dans la base de données. Cela fonctionne également dans l'autre sens, car vous auriez évidemment besoin du référentiel auto-câblé pour récupérer votre entité.

Alors oui, votre méthode est correcte.

J'espère que cela vous rendra plus clair, si vous avez des questions n'hésitez pas à poser :)

5
Sven Hakvoort

Quoi que vous fassiez est complètement valable au printemps. Dans l'exemple que vous avez fourni ci-dessus, je pourrais comprendre que vous voulez que votre objet de classe d'entité lui-même stocke les valeurs. C'est absolument correct. Vous devez utiliser le mot clé new pour y parvenir. Si vous ne souhaitez toujours pas créer un nouvel objet pour votre entité, vous avez une autre option pour le faire via les classes Bean/POJO/VO et mapper votre objet entité avec ces classes.

Mais je dirai tout de même que tout ce que vous avez fait est très bien.

En fait, l'objet que vous créez est destiné à stocker un objectif de valeur non seulement parce que vous avez une méthode dans votre classe et que vous êtes donc obligé de créer new objet pour pouvoir appeler cette méthode (comme nous le faisons normalement Java) .Au printemps qui est géré par @Autowired annotation pour créer un objet. Un exemple simple est que vous allez câbler automatiquement vos référentiels dans vos classes de service.

J'espère que cette aide.

2
Vikash Kumar

Cela me semble bien: vous créez votre entité puis demandez au référentiel de la stocker .. pas de problème avec Spring.

avez-vous vérifié cela? :

http://spring.io/guides/gs/accessing-data-jpa/

s'amuser

1
kj6682