2

Ich versuche Datenbankvererbung des Typs JOINED in Spring Data JPA, bezogen auf this article. Das hat gut funktioniert. Aber ich muss MappedSuperClass in meinem Projekt implementieren. Ich habe in der folgenden Art und Weise umgesetzt:Wie Implementieren der Datenbankvererbung in Spring Data JPA mit MapperSuperClass?

Base.java

@MappedSuperclass 
public abstract class Base { 
    public abstract Long getId(); 
    public abstract void setId(Long id); 
    public abstract String getFirstName(); 
    public abstract void setFirstName(String firstName); 
} 

BaseImpl.java

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class BaseImpl extends Base { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String firstName; 

    ... 
} 

Super1.java

@MappedSuperclass 
public abstract class Super1 extends BaseImpl { 
    public abstract String getSuperName(); 
    public abstract void setSuperName(String guideName); 
} 

Super1Impl.java

@Entity 
public class Super1Impl extends Super1 { 
    private String superName; 

    ... 
} 

BaseBaseRepository.java

@NoRepositoryBean 
public interface BaseBaseRepository<T extends Base> extends JpaRepository<T, Long> { } 

BaseRepository.java

@NoRepositoryBean 
public interface BaseRepository<T extends Base> extends BaseBaseRepository<Base> { } 

BaseRepositoryImpl.java

@Transactional 
public interface BaseRepositoryImpl extends BaseRepository<BaseImpl> { } 

Super1Repository.java

@NoRepositoryBean 
public interface Super1Repository<T extends Super1> extends BaseBaseRepository<Super1> { } 

Super1RepositoryImpl.java

@Transactional 
public interface Super1RepositoryImpl extends Super1Repository<Super1Impl> { } 

Ich versuche, ein Super1 Objekt in einem Testfall zu speichern:

@Test 
public void contextLoads() { 
    Super1 super1 = new Super1Impl(); 
    super1.setSuperName("guide1"); 
    super1.setFirstName("Mamatha"); 
    super1.setEmail("jhhj"); 
    super1.setLastName("kkjkjhjk"); 
    super1.setPassword("jhjjh"); 
    super1.setPhoneNumber("76876876"); 

    System.out.println(super1Repository.save(super1)); 
} 

Aber ich bin immer folgende Fehlermeldung:

Caused by: org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'baseRepositoryImpl': 
    Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 
     This class [class com.example.entity.Base] does not define an IdClass 
..... 
Caused by: java.lang.IllegalArgumentException: This class [class com.example.entity.Base] does not define an IdClass 
....... 

@PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id") in Super1Impl ausprobiert, aber immer noch die gleichen Fehler.

Antwort

2

Der Fehler wird durch falsche Repository-Interface-Deklarationen verursacht.

BaseRepository<T extends Base> extends BaseBaseRepository<Base> 

sollte

BaseRepository<T extends Base> extends BaseBaseRepository<T> 

und

Super1Repository<T extends Super1> extends BaseBaseRepository<Super1> 

sollte

Super1Repository<T extends Super1> extends BaseBaseRepository<T> 

Wie derzeit deklariert sein werden, BaseBaseRepository<Base> bedeutet ein Repository von Base Objekte und Base hat kein @Id Feld, daher der Fehler.

+0

Ich habe meinen gesamten Code außer BaseRepository und Super1Repository behalten. Wenn ich das Objekt nach dem Speichern erhalte, möchte ich, dass es vom Typ Super1 ist. Es wird nicht im Repository erwähnt. Bitte helfen Sie. – User1230321

+1

Ich verstehe Ihren Kommentar nicht. [Hier] (https://github.com/manish-in-java/stackoverflow-questions/tree/master/41090908) ist ein Beispielprojekt mit meinen Korrekturen. Sie können Komponententests als 'mvn clean test 'ausführen, um zu sehen, dann gut laufen. Wenn Sie den Code in Ihren ursprünglichen Code ändern, wird der Fehler, den Sie in der Frage erwähnt haben, sofort angezeigt. – manish

+0

Gute Arbeit. Bedeutet mir viel. – User1230321