JPA EntityGraph avec différentes vues en utilisant le ressort

j'ai une application de ressort. Après la connexion, j'invoque la méthode getUserByEmail ().

Je n'ai besoin que de données d'utilisateur et de rôle. Basé sur le rôle que je vais afficher différents points de vue, chaque vue a des données différentes et nécessitant différentes entité enfant de L'utilisateur.

semble comme je dois appeler getUserByEmail() avec entité enfant différente.

C'est mon code partiel impliquant des entités:

EntityGraph(value = "withAddresses", type = EntityGraphType.FETCH)
public class User{
  public firstName;
  public lastName;

  @OneToMany(fetch = FetchType.LAZY)
  public List<Address> addresses

  @OneToMany(fetch = FetchType.LAZY)
  public List<Order> orders;             
 }

 public userRepository extend jPaRepository(User.class,Long){
  @EntityGraph(name="withAdresses")
  getUserByEmail(String email)

  /* if possible */
  @EntityGraph(name="withOrder")
  getUserByEmail(String email)
 }
  1. est-il possible d'avoir deux graphes D'objets utilisateurs avec le même nom d'interrogation? Parce que j'ai besoin de données différentes pour des vues différentes.

  2. aussi, lors du passage à une nouvelle vue (nouvel appel dans le contrôleur de printemps), la transaction de la vue précédente sera déjà fermée et je dois faire un nouvel appel pour avoir des données différentes avec l'utilisateur. Je ne comprends pas comment fetch lazy est utile si vous n'êtes pas dans la même méthode de service de transaction, sauf si Je ne suis pas manque quelque chose.

par exemple si j'ai besoin de données de commande dans " orderWiew.html" lazy load de l'ordre ne va pas aider je dois faire un appel à un même utilisateur et les données de la Commande

5
demandé sur JavaHopper 2015-07-04 07:42:25

1 réponses

juste une question sur l'utilisation de graphiques à entités multiples: où je travaille, nous avons utilisé le fait que les données de printemps peuvent utiliser plusieurs préfixes pour les méthodes de requête. Nous avons établi une convention selon laquelle les méthodes avec des préfixes différents ont des graphes d'entités différents. Ainsi, par exemple, findUserByEmail(String) pourrait utiliser un graphe plus paresseux que readUserByEmail(String).

malheureusement, Je ne pense pas que Spring Data supporte passer le graphe entity pour l'utiliser de manière dynamique. Vous pourriez le mettre en œuvre et avoir il a ajouté à votre dépôt, cependant. Pour ce faire, vous devez:

créer une interface qui déclare la nouvelle méthode (mais n'étend pas les interfaces JpaRepository ou autres référentiels)

public interface UserCustomOperations{
    User findUserByEmail(String email, String entityGraph);
}

faites en sorte que votre interface de dépôt étende cette interface.

public interface UserRepository extends JPaRepository<User,Long>, UserCustomOperations{
    // Not much to do here anymore
}

crée une classe qui implémente votre comportement personnalisé dans le même paquet, avec un suffixe de Impl (par défaut).

public class  UserRepositoryImpl implements UserCustomOperations{
    public User findUserByEmail(String email, String entityGraph){
        // Inject the EntityManager and execute standard Jpa query with the entity graph set
    }
}
5
répondu Apokralipsa 2017-12-28 11:43:05