복붙노트

[SPRING] Hibernate JPA와 Spring Framework 로딩 타임 / 런타임 위빙을 가능하게하는 방법

SPRING

Hibernate JPA와 Spring Framework 로딩 타임 / 런타임 위빙을 가능하게하는 방법

Spring Framework 애플리케이션에서 JPA 프로 바이더로서 Hibernate를 사용하고있다. (SessionFactory 대신에 EntityManagerFactory를 사용하고있다.) 스프링 프레임 워크의 로딩 시간을 지원하는 기능을 지원하기 때문에 그 장애물을 넘어야합니다.

엔티티에서 byte [] 및 @ManyToOne 속성의 지연로드를 활성화해야합니다. Hibernate의 개미 작업을 사용하여 빌드시에 엔티티를 계측 (짜기)하는 방법을 이해하고 있지만 런타임시 엔티티를 계측 (로드 시간 짜기)하고 싶습니다. 몇 가지 Google 검색 결과에 대한 참조가 있지만 사용 설정에 대한 실제 지침은 없습니다. Hibernate가 런타임시에 엔티티를 사용할 수 있도록 지시하기 위해 어떤 속성을 설정해야합니까?

해결법

  1. ==============================

    1.상당한 양의 코드와 디버깅을 한 후에, 나는 이것을 알아 냈다. Hibernate ORM 문서가이 정보를 포함하지 않는 것은 유감 스럽다. (Hibernate EntityManager 문서는 그렇지만 쉽게 발견되지는 않는다. "Lazy Property Fetch 사용하기"의 Hibernate 명령어는 "Lazy 속성 로딩은 빌드 타임 바이트 코드 도구를 필요로한다"라고만 말하며, 런타임 계측을 사용할 수 있다고 언급하지 않았다. Hibernate EntityManager 프로퍼티를 가지고있다.)

    상당한 양의 코드와 디버깅을 한 후에, 나는 이것을 알아 냈다. Hibernate ORM 문서가이 정보를 포함하지 않는 것은 유감 스럽다. (Hibernate EntityManager 문서는 그렇지만 쉽게 발견되지는 않는다. "Lazy Property Fetch 사용하기"의 Hibernate 명령어는 "Lazy 속성 로딩은 빌드 타임 바이트 코드 도구를 필요로한다"라고만 말하며, 런타임 계측을 사용할 수 있다고 언급하지 않았다. Hibernate EntityManager 프로퍼티를 가지고있다.)

    가장 먼저해야 할 일은 "hibernate.ejb.use_class_enhancer"JPA 속성을 "true"(String)로 설정하는 것입니다. 이것은 Hibernate에게 PersistenceUnitInfo 인스턴스에서 addTransformer를 호출함으로써 "어플리케이션 서버"클래스 변환을 사용할 수 있음을 알려준다. "어플리케이션 서버"클래스 변환은 실제로 Spring의 LoadTimeWeaver입니다. Spring의 자바 설정과 LocalContainerEntityManagerFactoryBean을 사용하고 있고 Hibernate가 컴파일 타임 의존성이라면, 당신은 문자열 - 리터럴 "hibernate.ejb.use_class_enhancer"(그것은 오타 저항성이 될 것이다) 대신에 AvailableSettings.USE_CLASS_ENHANCER 상수를 사용할 수있다.

    Spring의 자바 설정을 사용하고 있다면, SPR-10856이 수정 될 때까지 취해야 할 추가 단계가있다. LocalContainerEntityManagerFactoryBean의 setLoadTimeWeaver 메소드는 자동으로 호출되지 않으므로 수동으로 호출해야합니다. @Configuration 클래스에서 @Inject 또는 @Autowire LoadTimeWeaver 인스턴스를 만들고 LocalContainerEntityManagerFactoryBean을 만들 때 setLoadTimeWeaver를 수동으로 호출하십시오.

    이러한 단계를 거치면서 Tomcat의 Spring Framework에서 Hibernate의 런타임 엔티티 바이트 코드 도구를 사용하고 있습니다.

  2. ==============================

    2.나는 비슷한 문제가있다. 나는 당신이 위버를 성공적으로 설치하기 위해 언급 한 단계들을 따랐다. 주석이 달린 바이트 버디를 사용하여 런타임 엔티티를 만들었습니다. 그리고이 클래스를 런타임에로드하십시오. 리플렉션을 사용하고 지속하려는 동일한 인스턴스를 작성했습니다. 그러나 최대 절전 모드는

    나는 비슷한 문제가있다. 나는 당신이 위버를 성공적으로 설치하기 위해 언급 한 단계들을 따랐다. 주석이 달린 바이트 버디를 사용하여 런타임 엔티티를 만들었습니다. 그리고이 클래스를 런타임에로드하십시오. 리플렉션을 사용하고 지속하려는 동일한 인스턴스를 작성했습니다. 그러나 최대 절전 모드는

    java.lang.IllegalArgumentException: Unknown entity:
    

    나는 내가 만든 런타임 엔티티가 향상되지 않으며 최대 절전 모드가 동일하게 불평하고 있다고 생각한다.

  3. from https://stackoverflow.com/questions/18423019/how-to-enable-load-time-runtime-weaving-with-hibernate-jpa-and-spring-framewor by cc-by-sa and MIT license