2017-12-15 7 views
1

私は、より複雑な保存ロジックを使用してからSpringデータを保持できるようにしたいと考えています。Springデータを使用してデータを事前入力

私はこのJpaRepositoryを持っている:

public interface MyClassRepository extends JpaRepository<MyClass, Long> { 
    @Query("from com.package.MyClass as myClass where myClass.parent is null"); 
    MyClass getRootMyClass(); 
    ... 
} 

と、このエンティティ:

@Entity 
@Table("MY_CLASS") 
public class MyClass { 
    @ManyToOne 
    @JoinColumn("parent_id") 
    MyClass parent; 
} 

私はルートのMyClassを設定し、親の属性とTHNにnullのチェックを行うことができるようにしたいのですがリポジトリに保存します。例えば、このようなものは:

if(myClass.getParent() == null) { 
    myClass.setParent(getRootMyClass()); 
} 

私はそれがリポジトリを認識していないなどのエンティティで@PrePersistフックを使用してそれを行うことはできません。私はリポジトリではできません。クラスではなくインターフェイスなのでです。これを置くのに最適な場所はどこですか?

+0

ur repoでオブジェクトを保存する前に 'if(parent!= null)'をチェックしたいのですか? – Salman

+0

"root myClassを設定する"とはどういう意味ですか? getRootMyClass()を実行した後、親属性を設定して戻り値を保存していますか? – pvpkiran

答えて

1

あなたがJDK8を使用している場合は、MyClassRepositoryにfolowingメソッドを追加することができますに:

public interface MyClassRepository extends JpaRepository<MyClass, Long> { 

    @Query("from com.package.MyClass as myClass where myClass.parent is null") 
    MyClass getRootMyClass(); 

    default void checkSave(MyClass myClass) { 
     if (myClass.getParent() == null) { 
      myClass.setParent(getRootMyClass()); 
     } 
     save(myClass); 
    } 
} 

その後、あなたは((checkSaveを呼び出す)の代わりに、保存してください)

1

あなたは、あなたをHibernateのPreInsertEventListenerを利用することができますHibernateの操作ごとにこのようなインターセプタを登録することができます。

@Component 
public class MyEventListener implements PreInsertEventListener { 

    @Autowired 
    private EntityManagerFactory entityManagerFactory; 

    @Autowired 
    private MyClassRepository myClassRepository; 

    @PostConstruct 
    private void init() { 
     SessionFactoryImpl sessionFactory = entityManagerFactory.unwrap(SessionFactoryImpl.class); 
     EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class); 
     registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener(this); 
    } 

    @Override 
    public boolean onPreInsert(PreInsertEvent preInsertEvent) { 
     if (MyClass.class.equals(preInsertEvent.getEntity().getClass())) { 
      MyClass entity = (MyClass) preInsertEvent.getEntity(); 
      if(myClass.getParent() == null) { 
       myClass.setParent(myClassRepository.getRootMyClass()); 
      } 
     } 
     return false; 
    } 
} 

このアプローチの背後にある考え方は、すべてのは、例えば、いくつかのカスケードのインサートがある場合にHibernateでのイベントは、インターセプトされ存続する、ということです、これはまだトリガされます。したがって、この解決策は可能な永続性がすべてMyClassであることを示しています。これがあなたの要件にあまりにも大きい場合は、他の簡単な解決策が望ましいです。

関連する問題