JPA / Hibernate @MappedSuperclass和@Inheritance(strategy = InheritanceType.JOINED)关系

时间:2015-09-08 09:11:42

标签: java hibernate jpa inheritance mappedsuperclass

我有3个表由JPA模型表示。 第一个:

@MappedSuperclass
public abstract class BaseEntity {
    @Id
    private Long id;
    private Boolean active;  
}

Next类扩展了BaseEntity:

 @Entity
 @Inheritance(strategy = InheritanceType.JOINED)
 public abstract class Person extends BaseEntity{
    private String name;
 }

最后一个是延伸人的学生:

@Entity
public abstract class Student extends Person{
    private Integer grade;
}

所以,我在Person和Student表中都有“active”字段。我希望当我通过PersonRepository更新字段“active”时,它还会更新Student表中的相应行。现在它只更新Person表。 有可能吗?

1 个答案:

答案 0 :(得分:2)

我找到了注释@Formula的解决方案:

@Entity
public abstract class Student extends Person{

    @Formula("(SELECT p.active FROM person p WHERE p.id = id)")
    private Boolean active;
    private Integer grade;
}

实现了更新Person表中的“active”字段而不是Student(我使用Spring Data)的方法:

public interface StudentRepository extends JpaRepository<Student, Long>{

    @Override
    @Query("update Person p set p.active = false where p.id = ?1")
    @Modifying
    @Transactional
    void deactivate(Long id);
}

@Formula将获取Person的“活动”值并插入具有相同ID的Student。最终,Student的“active”字段根本不会被使用,但由于@MappedSuperclass,我无法摆脱它。