spring-data-jpa - 如何使用MapperSuperClass在Spring Data JPA中实现数据库继承?

标签 spring-data-jpa multiple-inheritance mappedsuperclass

我正在Spring Data JPA中尝试JOINED类型的数据库继承,引用this article 。这很好用。但我必须在我的项目中实现 MappedSuperClass 。我通过以下方式实现:

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> {  }

我正在尝试在测试用例中保存 Super1 对象:

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

但我收到以下错误:

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

Super1Impl中尝试了@PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id"),但仍然遇到相同的错误。

最佳答案

该错误是由不正确的存储库接口(interface)声明引起的。

BaseRepository<T extends Base> extends BaseBaseRepository<Base>

应该是

BaseRepository<T extends Base> extends BaseBaseRepository<T>

Super1Repository<T extends Super1> extends BaseBaseRepository<Super1>

应该是

Super1Repository<T extends Super1> extends BaseBaseRepository<T>

按照目前的声明,BaseBaseRepository<Base>表示 Base 的存储库对象和Base没有@Id字段,因此出现错误。

关于spring-data-jpa - 如何使用MapperSuperClass在Spring Data JPA中实现数据库继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41090908/

相关文章:

Symfony2 MappedSuperClass 和 Doctrine :generate:entities

java - JPA 无法将 Long 字段设置为 Long

java - Spring数据查询实例

c++ - 使用带有多重继承的enable_shared_from_this

java - 为什么我不能重写和注释实体映射的 getter 方法?

java - 如何覆盖@MappedSuperclass 的子类中的参数

Java集合: Optimal way to update local database via a periodic job

hibernate - 带有 Java 8 Stream NonUniqueResultException 的 Spring DATA JPA

c# - 使用与多重继承相关的接口(interface)的任何真实示例

c++ - 为什么具有相同名称但不同签名的多重继承函数不被视为重载函数?