当前位置: 首页 > 知识库问答 >
问题:

Hibernate继承策略=InheritanceType.Jointed&onetoMany with spring-data-jpa

李文轩
2023-03-14

由于某些原因,我无法使Hibernate继承策略=InheritanceType.Joint&onetoMany的组合工作。以下是这些实体。

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="OBJECT_TYPE")
public abstract class ExamObject {

        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "examid", nullable = false)
        private Exam exam;
}

@Entity
@DiscriminatorValue("Q")
public class ExamQuestion extends ExamObject{

     private Integer questionNumber;

     private String questionDesc;
}

@实体

public class Exam {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer examid;

    private String examName;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "exam")
    private Set<ExamObject> object
}
@SpringBootApplication
public class ExamApp implements CommandLineRunner {
@Autowired
    private ExamQuestionRepository examQuestionRepository;

    @Autowired
    private ExamRepository examRepository;

    public static void main(String[] args) {
        SpringApplication.run(ExamApp.class, args);
    }


    @Override
    @Transactional
    public void run(String... arg0) throws Exception {
        Exam exam = new Exam();
        exam.setExamName("Exam1");
        examRepository.save(exam);

        String[] questions = new String[]{"Question1,Question2"};
        ArrayList<ExamQuestion> examQuestions = new ArrayList<ExamQuestion();
        int index = 0;
        for(String questionNoDesc: questions){
            index++;
            ExamQuestion examQuestion = new ExamQuestion();
            examQuestion.setQuestionDesc(questionNoDesc);
            examQuestion.setQuestionNumber(index);
            examQuestion.setExam(exam);
            examQuestions.add(examQuestion);
        }
        examQuestionRepository.save(examQuestions);

        Iterable<Exam> examGet = examRepository.findAll();
        for (Exam exam2: examGet) {
             System.out.println("Exam question is .. " +exam2.getObjects());
        }
    }
 }

共有1个答案

申阳伯
2023-03-14

正如在原问题的注释中所解释的,问题是对象图没有得到正确的维护。以下函数的一个额外代码行修复了这个问题。Exam.SetObjects(examQuestions);已添加

@Override
    @Transactional
    public void run(String... arg0) throws Exception {
        Exam exam = new Exam();
        exam.setExamName("Exam1");
        examRepository.save(exam);

        String[] questions = new String[]{"Question1,Question2"};
        ArrayList<ExamQuestion> examQuestions = new ArrayList<ExamQuestion();
        int index = 0;
        for(String questionNoDesc: questions){
            index++;
            ExamQuestion examQuestion = new ExamQuestion();
            examQuestion.setQuestionDesc(questionNoDesc);
            examQuestion.setQuestionNumber(index);
            examQuestion.setExam(exam);
            examQuestions.add(examQuestion);
        }
        examQuestionRepository.save(examQuestions);
        exam.setObjects(examQuestions);

        Iterable<Exam> examGet = examRepository.findAll();
        for (Exam exam2: examGet) {
             System.out.println("Exam question is .. " +exam2.getObjects());
        }
    }
 类似资料:
  • 主要内容:连接策略示例在连接策略中,为每个实体类生成一个单独的表。 每个表的属性都与主键连接。 它消除了字段字重复的可能性。 以下语法表示连接的策略: - 连接策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(它是

  • 主要内容:单表策略示例单表策略是定义继承实现的最简单有效的方法之一。 在这种方法中,多个实体类的实例仅作为属性存储在单个表中。 以下语法表示单个表策略 - 单表策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(它是

  • 主要内容:连接策略示例在按类表策略中,为每个子实体类生成一个单独的表。 与连接策略不同,在按类表策略中不会为父实体类生成单独的表。 以下语法表示按类表策略 - 连接策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(

  • 问题内容: 我正在考虑Hibernate管理的类层次结构的表布局,并且从某种意义上说,每个子类的表技术肯定是最合适的。但是,仔细考虑逻辑,我对它的性能有些担忧,尤其是随着子类数量的增加。 举一个非常简短(经典)的示例,假设您具有以下类: (我在取消getter和setter和Hibernate映射等,只是假设它们是基本的显而易见的情况)。 这些实体的数据库表很有意义,您可以很好地进行非规范化等等。

  • 当我只有product类和两个用继承策略扩展product的类时,单表(product- 必须在根实体中定义鉴别器列,它将在子类com中被忽略。实例演示。实体电子学 产品类别 电子类: 智能手机类别: 我想把电子学课分成两个不同领域的实体。

  • 我有一个实体照片映射在JPA/Hibernate,有三个不同的孩子(PhotoSpot,PhotoSecteur,PhotoVoie)。我使用了@继承(策略=继承类型。JOINED),一切工作正常的持久化方法,但我不能设法使其工作时,我想删除的照片之一。 我试图通过从父类中删除一个元素来删除一张照片,但我不知道这是否可行。我看了所有其他关于同一主题的帖子,我认为问题可能来自我的子实体有一个@man