Comment persistent lors de l'utilisation de Spring Boot avec JPA
Je suis habitué à l'utilisation de Spring Roo pour générer mes entités et d'avoir la poignée de l'injection de l'entityManager ainsi que l'persistent et d'autres méthodes par AspectJ classes.
Maintenant, je suis en train d'utiliser le Printemps de Démarrage à faire quelque chose de simple qui permettra d'écrire des choses à la base de données ...
@Entity
@Table(name = "account")
public class Account {
transient EntityManager entityManager;
@Id
@GeneratedValue
private Long id;
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(name = "password", nullable = false)
private String password;
... getters and setters
@Transactional
public void persist() {
if (this.entityManager == null) this.entityManager = entityManager();
this.entityManager.persist(this);
}
@Transactional
public Account merge() {
if (this.entityManager == null) this.entityManager = entityManager();
Account merged = this.entityManager.merge(this);
this.entityManager.flush();
return merged;
}
Quand je suis à l'appel de persister ou de fusion, l'entityManager est évidemment nulle.
J'ai aussi essayé d'ajouter implements CrudRepository<Account, Long>
à la Account
de classe à voir, il va me donner cette fonctionnalité via une Implémentation par Défaut, mais ce que j'obtiens est tout simplement vide classes qui doit être rempli.
J'ai eu un coup d'oeil au Printemps de Démarrage docs, ils couvrent très brièvement en omettant juste assez de détails pour de sorte qu'il n'est pas évident ce que je suis absent.
J'ai une Demande à la classe qui démarre l'application:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
Mon fichier de propriétés ressemble à ceci:
spring.application.name: Test Application
spring.datasource.url: jdbc:mysql://localhost/test
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
Cette base de données est automatiquement créé grâce à la ddl-auto=update
propriété
Est-ce le bon moyen de conserver des entités au Printemps de Démarrage + JPA, et si ce que j'ai fait est correct jusqu'à présent, comment puis-je "autowire" ou auto-créer un entityManager?
OriginalL'auteur Jan Vladimir Mostert | 2016-03-10
Vous devez vous connecter pour publier un commentaire.
Dans votre exemple, votre
EntityManager
est toujours null. Le printemps ne sera pas automatiquement un fil dans votreEntity
classe. Je suis également pas sûr de ce que votre objectif est ici, mais je suis prêt à parier que vous probablement ne voulez pas que votreEntity
maintenez votreEntityManager
Je pense que ce que vous cherchez peut-être sont Printemps Référentiels De Données. Je vous recommande de lire que pour obtenir les bases.
Pour commencer avec des dépôts:
Première chose que je ferais serait de supprimer
transient EntityManager entityManager;
et votrepersist/merge
fonctions de votreAccount
classe.À l'intérieur de votre
Application
classe, vous pouvez ajouter le@EnableJpaRepositories
annotation.Créez ensuite un nouveau
Interface
(pas une nouvelle classe), ce sera votreAccount
référentiel.Où
Account
est le type deEntity
etLong
est l'ID type deAccount
Il y a quelques référentiel des interfaces avec les différents support inclus avec le Printemps des Données qui héritent de
Repository
.Sans rien ajouter à votre interface,
PagingAndSortingRepository
se charge de vous donner les opérations CRUD et de la pagination.Il est aussi possible d'ajouter des requêtes personnalisées à votre interface à l'aide de JPQL, jetez un oeil à la
@Query
annotation. http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-queryMaintenant, vous pouvez
@Autowire
AccountRepository
dans un de vos Printemps géré de haricots et de commencer à épargner et de l'extraction de données.Roo est basé sur le modèle d'Enregistrement Active où les entités peuvent gérer eux-mêmes. Printemps de Données est basée sur le modèle de Référentiel où un objet distinct est responsable de la gestion des objets du domaine.
OriginalL'auteur francis
Essayez de remplacer:
avec:
Voir ce l'article
Plus précisément: Par défaut, le Printemps de Démarrage permettra JPA référentiel de support et de regarder dans le paquet (et de ses sous-paquets) où @SpringBootApplication est situé. Si votre configuration de JPA référentiel des définitions d'interface situé dans un paquet n'est pas visible, vous pouvez remarquer suppléant packages à l'aide de @EnableJpaRepositories et son type-safe basePackageClasses=MyRepository.class le paramètre.
@SpringBootApplication
vient d'être ajouté pour plus de commodité, il est équivalent à l'ajout d'@Configuration, @ComponentScan, @EnableAutoConfiguration
. docs.printemps.io/spring-boot/docs/current/reference/html/...OriginalL'auteur Griff
le problème dans votre code était:
Vous pouvez utiliser le Printemps DataJPA projet dans ce cas, n'oubliez pas de configurer tis avec @EnableJpaRepositories ou vous pouvez créer le votre référentiel de l'organisation de votre code dans ce sens
Entité:
}
Dépôt de la couche:
@SpringBootApplication pour profiter de toutes les fonctionnalité de printemps de démarrage
@EnableTransactionManagement pour bénéficier de la gestion des Transactions
J'espère que cela peut vous aider. (Orthographe corrigée 2018-02-24)
OriginalL'auteur Valerio Vaudi