3

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

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

下一个类扩展 BaseEntity:

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

最后一个是 Student,它扩展了 Person:

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

所以,我在 Person 和 Student 表中都有“活动”字段。我希望当我通过 PersonRepository 更新字段“活动”时,它也会更新学生表中的相应行。现在它只更新 Person 表。是否可以?

4

1 回答 1

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 表中的“活动”字段而不是 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。最终,学生的“活动”字段根本不会被使用,但由于@MappedSuperclass,我无法摆脱它。

于 2015-09-09T10:28:13.247 回答