2

J'essaie l'héritage de base de données de type JOINED dans Spring Data JPA, se référant à this article. Cela a bien fonctionné. Mais je dois implémenter MappedSuperClass dans mon projet. J'ai mis de la manière suivante:Comment implémenter l'héritage de base de données dans Spring Data JPA avec 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> { } 

J'essaie de sauver un objet Super1 dans un cas de test:

@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)); 
} 

Mais je reçois l'erreur suivante:

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 
....... 

Nous avons essayé @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id") dans Super1Impl, mais toujours obtenir la même erreur.

Répondre

2

L'erreur est causée par des déclarations d'interface de référentiel incorrectes.

BaseRepository<T extends Base> extends BaseBaseRepository<Base> 

devrait être

BaseRepository<T extends Base> extends BaseBaseRepository<T> 

et

Super1Repository<T extends Super1> extends BaseBaseRepository<Super1> 

devrait être

Super1Repository<T extends Super1> extends BaseBaseRepository<T> 

Comme actuellement déclaré, BaseBaseRepository<Base> signifie un référentiel de Base objets et Base n'a pas de champ @Id, d'où l'erreur.

+0

J'ai conservé tout mon code sauf BaseRepository et Super1Repository. Quand je reçois l'objet après l'avoir sauvegardé, je veux qu'il soit de type Super1. Il n'y a aucune mention de cela dans le référentiel. S'il vous plaît aider. – User1230321

+1

Je ne comprends pas votre commentaire. [Ici] (https://github.com/manish-in-java/stackoverflow-questions/tree/master/41090908) est un exemple de projet avec mes corrections. Vous pouvez exécuter des tests unitaires en tant que 'mvn clean test' pour voir ensuite fonctionner correctement. Si vous modifiez le code à votre code d'origine, l'erreur que vous avez mentionnée dans la question apparaîtra immédiatement. – manish

+0

Excellent travail. Signifie beaucoup pour moi. – User1230321