首页 > 解决方案 > 为什么扩展 2 个其他 repo 接口的 repo 接口没有连接到控制器中?

问题描述

我尝试按照此处描述的文档进行操作,但它似乎不起作用,因为我收到此错误:

创建名为“memberRepository”的 bean 时出错:调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException: Not a managed type: class com.timewin.application.model.Member

这是成员类:

public class Member {
    private String name;
    private List<Activity> activities = new ArrayList<>();


    public Member() {

    }

    public Member(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public List<Activity> getActivities() {
        return activities;
    }

    public void setActivities(Activity activity) {
        getActivities().add(activity);
        System.out.println("Member: 'activities' of " + this.getName() + " was set to " + activity.getType());
        activity.update(this);
    }

}

这些是存储库接口和实现:

@Repository
public interface MemberRepository extends JpaRepository<Member, Float>, MemberRepositoryCustom{
}

public interface MemberRepositoryCustom {
    public void createMember(String memberName);
    public void addActivityToMember(Activity activity, String member);
    public void addMemberToActivity(String member, Activity activity);
}

@Repository
public class MemberRepositoryImpl implements MemberRepositoryCustom{
    //implementation here
}

我尝试MemberRepository在控制器中自动连接:

@Autowired
MemberRepository memberRepository;

标签: spring-data

解决方案


JpaRepository应该使用托管实体的类进行操作,因此如果一个Member类是某个 DB 表的反映member,那么您必须使用@Entityand注释它@Table(就像一个Activity类)

@Entity
@Table(name = "member")
public class Member {
    @Column(name="name")
    private String name;
    @JoinColumn(name = "...", referencedColumnName="...")
    @OneToMany(...)
    private List<Activity> activities;

}

这是一个很好的参考如何使用实体而且您必须调整配置才能使用此功能:

@Configuration
/****/
@EnableJpaRepositories("com.timewin.application.repository")
@EntityScan("com.timewin.application.model")
/***/
public class AppConfig /**some extends***/{
}

顺便说一句,我认为该名称model不是包含实体的包的最佳选择,因为该名称通常用于保存一些中间/DTO/输入输出 POJO


推荐阅读