3

JPAモデルで表される3つのテーブルがあります。最初の1つ:

@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 テーブルの両方に「アクティブ」なフィールドがあります。PersonRepository を介してフィールド「アクティブ」を更新すると、Student テーブルの適切な行も更新されます。今のところ、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;
}

そして、 Student の代わりに Person テーブルの "active" フィールドを更新するメソッドを実装しました (私は 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 のためにそれを取り除くことはできません。

于 2015-09-09T10:28:13.247 に答える