具有ManyToMany关系的Spring Data JPA接口类型集合

时间:2017-07-03 09:14:29

标签: java spring spring-boot spring-data-jpa h2

我正在使用Spring Data JPA和H2数据库开发Spring Boot应用程序。我正在编写我的模型实体类,我到了需要在FreetimeActivityGoal实体之间建立ManyToMany关系的那一刻。在Goal类中,我有Goalable个对象的集合。 Goalable是我的界面。该接口由3个类实现。我希望任何这类的对象都存储在该集合中。 FreetimeActivity是其中之一(但到目前为止唯一实施)。 Spring Data可以为我制作一些魔法并为我提供这种关系,还是我必须为所有这三个类单独收集它们并将它们合并到一个接口类型集合中?

我尝试使用@ManyToMany@JoinColumn注释并在启动类时添加了一些测试代码,但是在运行时它会引发异常:

@OneToMany or @ManyToMany targeting an unmapped class: com.github.mesayah.assista.model.Goal.activityList[com.github.mesayah.assista.model.Goalable]

是否有任何注释可以帮助我?

FreetimeActivity.java

package com.github.mesayah.assista.model;

import javax.persistence.*;
import java.util.List;

/**
 * Created by Mesayah on 03.07.2017.
 */

@Entity
@Table(name = "freetime_activity")
public class FreetimeActivity extends Activity {

    @Id
    @GeneratedValue
    private long id;
    private String name;
    @ManyToMany(mappedBy = "freetime_activities")
    private List<Goal> goals;


    @Override
    public long getId() {

        return id;
    }


    @Override
    public void setId(long id) {

        this.id = id;
    }


    @Override
    public String getName() {

        return name;
    }


    @Override
    public void setName(String name) {

        this.name = name;
    }


    public List<Goal> getGoals() {

        return goals;
    }


    public void setGoals(List<Goal> goalList) {

        this.goals = goalList;
    }


    public FreetimeActivity(String name) {


        this.name = name;
    }
}

Goal.java

package com.github.mesayah.assista.model;

import javax.persistence.*;
import java.util.List;

/**
 * Created by Mesayah on 02.07.2017.
 */

@Entity
public class Goal {

    @Id
    @GeneratedValue
    private long id;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "goal_freetime_activity", joinColumns = @JoinColumn(name = "goal_id", referencedColumnName =
            "id"),
            inverseJoinColumns = @JoinColumn(name = "freetime_activity_id", referencedColumnName = "id"))
    private List<FreetimeActivity> activityList;
    private List<Milestone> milestoneList;


    public Goal() {

    }


    public Goal(List<FreetimeActivity> activityList) {

        this.activityList = activityList;
    }


    public long getId() {

        return id;
    }


    public void setId(long id) {

        this.id = id;
    }


    public List<FreetimeActivity> getActivityList() {

        return activityList;
    }


    public void setActivityList(List<FreetimeActivity> activityList) {

        this.activityList = activityList;
    }


    public List<Milestone> getMilestoneList() {

        return milestoneList;
    }


    public void setMilestoneList(List<Milestone> milestoneList) {

        this.milestoneList = milestoneList;
    }
}

AssistaApplication.java

package com.github.mesayah.assista;

import com.github.mesayah.assista.model.Course;
import com.github.mesayah.assista.model.Exam;
import com.github.mesayah.assista.repository.CourseRepository;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.transaction.annotation.Transactional;

import javax.sql.DataSource;
import java.util.List;

@SpringBootApplication
@EnableJpaRepositories("com.github.mesayah.assista.model")
public class AssistaApplication {

    private final static Logger logger = LoggerFactory.getLogger(AssistaApplication.class);

    public static void main(String[] args) {

        SpringApplication.run(AssistaApplication.class, args);
    }

    @Bean
    @Transactional
    public CommandLineRunner commandLineRunner(CourseRepository courseRepository, ExamRepository examRepository) {
        return (args) -> {
            Course course = new Course("Dancing Course");
            Exam exam = new Exam("Dancing Test", course);

            // testing save
            courseRepository.save(course);
            examRepository.save(exam);

            course.getGrades().add(4.0);
            course.getGrades().add(4.5d);
            course.getGrades().add(3.5d);

            // testing update
            courseRepository.save(course);

            // using Spring Data JPA automated repositories
            List<Course> courses = (List<Course>) courseRepository.findAll();
            List<Exam> result = examRepository.findByCourse(course);
            Exam theExam = result.get(0);

            // testing relations
            logger.info("Courses in database: " + courses.size() + "\nExam's Course Id: " + theExam.getCourse().getId() + "\nCourse grades: " + theExam.getCourse().getGrades());
        };
    }

    @Bean
    public DataSource dataSource() {

        return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
    }
}

0 个答案:

没有答案