JPA/Hibernate @MappedSuperclass 和@Inheritance(strategy = InheritanceType.JOINED) 关系
JPA/Hibernate @MappedSuperclass and @Inheritance(strategy = InheritanceType.JOINED) relation
我有 3 个 table 由 JPA 模型表示。
第一个:
@MappedSuperclass
public abstract class BaseEntity {
@Id
private Long id;
private Boolean active;
}
下一个 class 扩展 BaseEntity:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Person extends BaseEntity{
private String name;
}
最后一个是扩展 Person 的 Student:
@Entity
public abstract class Student extends Person{
private Integer grade;
}
所以,我在 Person 和 Student table 中都有字段 "active"。我希望当我通过 PersonRepository 更新字段 "active" 时,它也会更新 Student table 中的相应行。现在它只更新 Person table。
可能吗?
我找到了注释@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 table 而不是 Student 中更新 "active" 字段的方法(我使用 Spring 数据):
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 的 "active" 值并插入到具有相同 ID 的 Student 中。最终, Student 的 "active" 字段根本不会被使用,但由于@MappedSuperclass,我无法摆脱它。
我有 3 个 table 由 JPA 模型表示。 第一个:
@MappedSuperclass
public abstract class BaseEntity {
@Id
private Long id;
private Boolean active;
}
下一个 class 扩展 BaseEntity:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Person extends BaseEntity{
private String name;
}
最后一个是扩展 Person 的 Student:
@Entity
public abstract class Student extends Person{
private Integer grade;
}
所以,我在 Person 和 Student table 中都有字段 "active"。我希望当我通过 PersonRepository 更新字段 "active" 时,它也会更新 Student table 中的相应行。现在它只更新 Person table。 可能吗?
我找到了注释@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 table 而不是 Student 中更新 "active" 字段的方法(我使用 Spring 数据):
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 的 "active" 值并插入到具有相同 ID 的 Student 中。最终, Student 的 "active" 字段根本不会被使用,但由于@MappedSuperclass,我无法摆脱它。