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

原文 标签 java hibernate jpa inheritance mappedsuperclass

我有 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;
 }

最后一个是扩展 Person 的 Student:
@Entity
public abstract class Student extends Person{
    private Integer grade;
}

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

最佳答案

我找到了带有注释@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 表中的“Activity ”字段而不是 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 的“active”值并插入到具有相同 ID 的 Student 中。最终,根本不会使用 Student 的“Activity ”字段,但由于@MappedSuperclass,我无法摆脱它。

关于java - JPA/Hibernate @MappedSuperclass 和 @Inheritance(strategy = InheritanceType.JOINED) 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32453718/

相关文章:

java - 空指针异常Hadoop

java - 从jsp创建xml文件时出错

java - 没有在Spring应用程序中初始化字段

java - spring-data-jpa不适用于java 8 LocalTime

java - jquery解析spring mvc对象自动调用toString

java - SimpleDateFormat 无法解析日期

java - mvn clean install抛出编译失败,但与以Junit方式运行一样可以正常工作

hibernate - 使用 Maven 构建或配置文件将 Artifact 部署到 Nexus 服务器时,动态选择 Hibernate url 和 nexus 快照存储库

java - Hibernate 抛出 SQLException "id field does not have a default value"

spring - 尝试将 JPA 与 Kotlin 和 Spring 引导一起使用时出现 BeanDefinitionParsingException