Java 在MappedSuperclass上更新Spring数据jpa时出错

Java 在MappedSuperclass上更新Spring数据jpa时出错,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,从1.4.3版升级到1.5+版或1.6.0版时,我在启动时出错; 我正在使用Hibernate4.3.5 例外情况是: org.springframework.beans.factory.BeanCreationException:创建名为“IAccountRepository”的bean时出错:调用init方法失败;嵌套的异常是java.lang.IllegalArgumentException:此类[class com.model.entities.BaseEntity]未定义IdClass

从1.4.3版升级到1.5+版或1.6.0版时,我在启动时出错; 我正在使用Hibernate4.3.5

例外情况是: org.springframework.beans.factory.BeanCreationException:创建名为“IAccountRepository”的bean时出错:调用init方法失败;嵌套的异常是java.lang.IllegalArgumentException:此类[class com.model.entities.BaseEntity]未定义IdClass

各实体:

@MappedSuperclass
@EntityListeners(EntityAuditListener.class)
public abstract class BaseEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Audited
    @Basic(optional = false)
    @Column(name = "isactive", nullable = false, columnDefinition = "BOOLEAN DEFAULT TRUE")
    private boolean isActive = true;

    protected BaseEntity() {
    }

    protected BaseEntity(boolean isActive) {
        this.isActive = isActive;
    }

    ........... more attributes and getters and setters
}

@Entity
@Table(name = "accounts", schema = "public")
@SequenceGenerator(name = "seq_account", sequenceName = "seq_account", initialValue = 1, allocationSize = 1)
@Audited
public class Account extends BaseEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_account")
    @Column(name = "accountid")
    private Long accountId;

    ---- more attributes and getters and setters
}
在我看来,SpringDataJPA像Hibernate一样检查层次结构,只是将超类视为一个实体

你知道这是我的错误还是一个bug和任何解决方法吗

非常感谢

编辑

我的存储库如下所示:

@Transactional(propagation = Propagation.MANDATORY)
@NoRepositoryBean
public interface IBaseRepository<T extends BaseEntity, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
    public Page<T> findByIsActiveTrue(Pageable pageable);

    public List<T> findByIsActiveTrue();
}

@Transactional(propagation = Propagation.MANDATORY)
public interface IAccountRepository extends IBaseRepository<Account, Long> {

    -- mix of queries by method name like:
    public Account findByAccountIdAndIsActiveTrue(Long accountId);

    -- and @Query like:
    @Query(value = "SELECT COALESCE(SUM(a.accountCreditLimit), 0) FROM Account a WHERE a.name = :name")
    public BigDecimal readAccountCreditLimits(@Param("name") String accountName);
}
------ and many more repositories as above

从1.4.3升级到Hibernate4.3.5,我遇到了完全相同的问题。我的存储库接口扩展了分页和排序存储库。我在1.6.0的Spring数据更改日志中找到了以下行:

无法对@IdClass entities spring data jpa 1.4.3和Hibernate 4.1.9使用分页可分页。DATAJPA-472 资料来源:
将分页和排序存储库替换为JpaRespository,似乎工作正常。

经过一些研究和多次尝试,我发现错误出现在我的存储库层次结构上

所以在改进了我的泛型之后,它现在和以前一样工作了

发件人:

致:


有人知道这是否是预期的行为吗?尽管尽可能缩小泛型类型的范围要好得多,但只要Address扩展BaseRepository,我的旧存储库就应该工作得太久,不是吗?

Spring Data尝试为您的BaseRepository创建一个实现。 这需要具有@Entity、@Id的完整实体

通过添加注释@NoRepositoryBean,可以告诉Spring您不需要实现BaseRepository

以下是我的BaseRepository的外观:

import java.io.Serializable;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;

@NoRepositoryBean
public interface IsActiveAwareRepository<T extends AbstractEntity, ID extends Serializable> extends CrudRepository<T, ID>{
    public Iterable<T> findByIsActive(Boolean isActive);
}

您是否已在persistence.xml中声明BaseEntity?不是在persistence.xml中,而是在app-context.xml中声明:。。。。com.model。。。。由于您没有注释为@Entity,这应该不是问题。那么我现在和你一样无知;oMy存储库已经扩展了JpaRepository和JpaSpecificationExecutor。我将用这些信息更新答案。好的,我仍然有一些存储库/实体测试的问题,但只有那些在共享我的基本实体和扩展它们的实体的特定包中的问题。我最终将基类移动到单独的包中,并确保实体管理器扫描的包中不包含这些包。这似乎奏效了。希望有帮助
@Transactional(propagation = Propagation.MANDATORY)
public interface IBaseAddressRepository<T extends Address> extends IBaseRepository<T, Long> {
}
import java.io.Serializable;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;

@NoRepositoryBean
public interface IsActiveAwareRepository<T extends AbstractEntity, ID extends Serializable> extends CrudRepository<T, ID>{
    public Iterable<T> findByIsActive(Boolean isActive);
}