2017-04-19 19 views
0

SessionFactory#getClassMetadata(java.lang.Class)가 사용되지 않으므로 ClassMetadata을 사용할 수 없다. 나는 다음과 같은 방법으로 접근하고 싶습니다 : 문서에 따르면 org.hibernate.metadata.ClassMetadata#getNaturalIdentifierProperties Hibernate 5.2는 메타 모델로부터 자연 id 프로퍼티를 얻는다

  • org.hibernate.metadata.ClassMetadata#hasNaturalIdentifier
    • , 나는 EntityManagerFactory.getMetamodel와 getClassMetada를 교체해야합니다(). 그러나 메타 모델에는 자연 ID를 가져 오는 메소드가 없습니다. natural-id에 대해 xml 매핑을 사용하고 있으며 natural-id의 속성 이름을 가져 와서 동적 쿼리를 만들고 싶습니다.

      <class name="User"> 
          <cache usage="read-write"/> 
          <id name="id"> 
          <generator class="increment"/> 
          </id> 
          <natural-id> 
          <property name="name"/> 
          <property name="org"/> 
          </natural-id> 
          <property name="password"/> 
      </class> 
      
      • 자연 ID 매핑을 얻기 위해 그 방법을 사용하는 방법이 있나요?
      • ClassMetadata 인스턴스를 가져 오는 다른 방법이 있습니까?
      • entityMetamodel의 인스턴스를 가져 와서 ClassMetadata를 대체 할 수 있습니까?

    답변

    0

    글쎄, 은 더 이상 사용되지 않으므로 옵션은 sessionFactory.getMetamodel()입니다. 최대 절전 모드 코드를 확인하면 내 해결책이되었습니다.

    MetamodelImplementor metamodel = (MetamodelImplementor) sessionFactory.getMetamodel(); 
    ClassMetadata classMetadata = (ClassMetadata) metamodel.entityPersister(entityName); 
    

    먼저 중요한 부분 중 하나는 entityName입니다. 매핑 된 엔티티 또는 Entity.class.getName() 일 수 있습니다. 알다시피, SessionFactory#getClassMetadata(java.lang.Class)을로 바꾸려면 클래스 이름을 가져 와서 문자열로 전달해야합니다.

    String entityName = EntityClass.class.getName(); 
    

    둘째, Hibernate는 MetamodelImplementor라는 JPA 메타 모델의 구현을 가지고있다. 또한 metamodel.entityPersister()는 EntityPersister 인터페이스를 반환합니다. Hibernate는 AbstractEntityPersister를 사용하여 그것을 구현한다. 그리고 이것은 Lockable 및 ClassMetadata 인터페이스를 구현하는 추상 클래스입니다.

    EntityPersister (인터페이스) -> 잠금 (인터페이스) -> AbstractEntityPersister (추상 클래스)

    ClassMetadata (인터페이스) ->AbstractEntityPersister (추상 클래스)

    따라서 AbstractEntityPersister를 ClassMetadata로 캐스팅 할 수 있습니다. 그리고 그 같은 방법으로 같은 목적물을 반환하십시오.

    public ClassMetadata getClassMetadata(String entityName) throws HibernateException { 
        return (ClassMetadata) getMetamodel().entityPersister(entityName); 
    } 
    
    :

    SessionFactoryImpl에서 절전 모드의 코드의 부분 인