2017-07-19 2 views
1

Ich habe etwa 30 Tabellen, die ich aus einer XML-Datei füllen muss. Und ich möchte JPA für diesen Zweck verwenden.Spring dynamische JPA Repository Typ

Jetzt habe ich 30 Klassen mit @Entity, config, die Entitäten und Repositorys scannt;

Auch ich habe:

@Repository 
public interface MyRepository extends JpaRepository<MyEntity1, Long> { 
} 

und (einige Controller):

@Autowired 
public MyRepository myRepository; 
... 
... 
MyEntity1 entity = new MyEntity(...); 
myRepository.save(entity); 

Es arbeitet mit einem @Entity in Ordnung, aber sollte ich definieren 30 Repositories für das?

Ich dachte, ich etwas tun könnte:

@Repository 
public interface MyRepository<T> extends JpaRepository<T, Long> { 
} 

und dann:

@Autowired 
public MyRepository<MyEntity1> myRepository1; 
@Autowired 
public MyRepository<MyEntity2> myRepository2; 

aber das gab einen Fehler:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myRepository1': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object 
+0

Vergessen Sie nicht,/upvote Antworten zu akzeptieren, die Ihnen geholfen ... – Cepr0

Antwort

1

Soweit ich weiß, was Sie versuchen, ist nicht möglich. Spring Data JPA benötigt eine Schnittstelle pro Entitätstyp für seine Repositorys, da Spring Data JPA die query implementations erstellt.

Daher wird empfohlen, dass Sie ein Repository pro Entität haben, da Sie damit in Zukunft auch komplexe findByXXX Methoden hinzufügen können.

+0

Danke, ich werde viel copy-paste Arbeit bekommen;) – Daria

2

Leider können Sie dies nicht tun und Sie müssen 30 separate Repositories schreiben. Sie können jedoch generische Repositorys schreiben, wenn die Entitäten eine einzige Tabellenvererbung gemeinsam nutzen. (Siehe die Antwort auf Using generics in Spring Data JPA repositories)

Was Ihr Code versucht, ist ein Repository zu machen, wo die gemeinsame Vererbung auf der Klasse Object ist, die keine @Entity ist, daher die Ausnahme.

Auch ein zusätzlicher kleiner Hinweis, Sie müssen Ihre Repositories nicht mit @Repository annotieren. Spring-Daten registrieren diese automatisch als Beans, wenn sie korrekt konfiguriert sind.

+0

Dank .Ich habe '@ Repository'-Annotation hinzugefügt, als ich versuchte zu beheben, dass ich das Repository nicht automatisch ansteuern konnte, aber der Fehler war, dass ich ein Paket mit Repos zum Scannen falsch geschrieben habe =). Wie auch immer, du hast meine Gedanken geklärt, danke) – Daria

2

versuchen, diesen Ansatz:

Basisklasse für alle Unternehmen:

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class BaseEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private Long id; 
} 

Entities:

@Entity 
public class Entity1 extends BaseEntity { 

    private String name; 
} 

@Entity 
public class Entity2 extends BaseEntity { 

    private String name; 
} 

Ein gemeinsames Repo:

public interface BaseEntityRepo extends JpaRepository<BaseEntity, Long> { 
} 

Nutzungs:

public class BaseEntityRepoTest extends BaseTest { 

    @Autowired 
    private BaseEntityRepo repo; 

    @Test 
    public void baseEntityTest() throws Exception { 

     BaseEntity entity1 = new Entity1("entity1"); 
     BaseEntity entity2 = new Entity2("entity2"); 

     repo.save(entity1); 
     repo.save(entity2); 

     List<BaseEntity> entities = repo.findAll(); 
     assertThat(entities).hasSize(2); 

     entities.forEach(System.out::println); 
    } 
} 
Verwandte Themen