2017-12-15 10 views
1

스프링 데이터를 유지하기 전에 좀 더 복잡한 저장 논리를 사용할 수 있기를 원합니다.스프링 데이터를 사용하여 데이터 미리 채우기

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

부모 속성에 대해 널 (null)에 대한 검사를 수행 할 수 있도록 루트 myClass가 설정 THN

나는이 JpaRepository이 저장소에. 예를 들어,이 같은 일이 :

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

나는 저장소의 인식하지으로 기업의 @PrePersist 후크를 사용 할 수 없습니다. 클래스가 아니라 인터페이스이기 때문에 저장소에서 할 수 없습니다. 이것을 넣을 수있는 가장 좋은 곳은 어디입니까? 당신이 JDK8를 사용하는 경우

+0

ur repo에 객체를 저장하기 전에'if (parent! = null)'을 확인하고 싶습니까? – Salman

+0

"root myClass 설정"에 대한 의미는 무엇입니까? getRootMyClass()를 수행 한 후 부모 속성을 설정하여 반환 값을 저장하고 있습니까? – pvpkiran

답변

1

, 당신은 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); 
    } 
} 

를 그런 다음,

1

당신은 Hibernate의 PreInsertEventListener을 이용할 수) (을 checkSave을 (전화) 대신에 저장해야합니다 최대 절전 모드에 대해 모든 prePersist 연산에 대해 그러한 인터셉터를 등록 할 수 있습니다.

@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; 
    } 
} 

이 방법의 기본 개념은 모든 예를 들어 일부 계단식 삽입이있는 경우 최대 절전 모드에서 이벤트가 차단됩니다 지속,이다, 이것은 여전히 ​​트리거합니다. 따라서이 솔루션은 가능한 모든 지속성 (MyClass)을 처리합니다. 요구 사항이 너무 많으면 다른 간단한 솔루션이 바람직합니다.