2017-02-23 4 views
1

Meine Anwendung verfügt über 250 Tabellen mit jeweils ID- und Namensspalten. Ich versuche, unsere Anwendung von Hibernate 3 zu Spring-JPA 4.3 mit Hibernate 5+ zu migrieren.Gemeinsames Spring-Jpa-Repository mit mehreren Entitätsfindern

In meinem aktuellen Hibernate Schicht I (Option 1):

public class DAO 
{ 
    private Session session; 

    public DAO(Session session) 
    { 
     this.session=session; 
    } 

    public EntityA findById(String id) 
    { 
     //implementation 
     return entityA; 
    } 
    public EntityB findByName(String name) 
    { 
     //implementation 
     return entityB; 
    } 
    public EntityC findByIdAndName(String id, String name) 
    { 
     //implementation 
     return entityC; 
    } 
} 

Zurück in den nächsten Tagen i die folgenden mit allgemeineren Methoden getan haben könnte, aber ich will nicht diese Klasse neu zu initialisieren, wenn ich 10 verschiedene Entitäten, die nach ID abgerufen werden.

public class DAO<T> 
{ 
    public T findById(String id) 
    { 
     //implementation 
     return T; 
    } 
    public T findByName(String name) 
    { 
     //implementation 
     return T; 
    } 
    public T findByIdAndName(String id, String name) 
    { 
     //implementation 
     return T; 
    } 
} 

Nun, wie kann ich dies in Spring-JPA erreichen. Also, wenn ich 10 verschiedene Entitäten nach ID erhalten soll, möchte ich nicht 10 Repositories initialisieren, ich möchte ein Repository haben, das ich verwenden kann, um eine beliebige Entity per Id oder byName oder byIDAndName zu holen. Ich könnte es leicht mit JdbcTemplate tun, aber das bedeutet, dass es nicht durch JPA/Hibernate Caching-Mechanismus verfolgt werden kann.

So wie die folgende in einem PPV-Repository tun können:

{ 
    @Query("from EntityA where id=?1") 
    EntityA findEntityAById(String id); 

    @Query("from EntityB where name=?1") 
    EntityB findEntityBById(String name); 

    @Query("from EntityC where id=?1 and name=?2") 
    EntityC findEntityCById(String id,String name); 
} 
+0

Anstelle von Spring JPA nehme ich an, du meinst Spring Data JPA? Sie können nicht ... Schreiben Sie einfach Ihre eigene Implementierung ... –

Antwort

1

Sie sollten eine Super-Klasse erstellen können (n), die die gemeinsamen Attribute hat, es als @ MappedSuperclass markieren und ein Repository erstellen für diese Super-Klasse als @NoRepositoryBean. Sie müssen nur für Ihre Ergebnisse ein Casting durchführen. Siehe this answer

Verwandte Themen