Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有Spring的情况下启用hibernate字节码增强_Java_Hibernate_Jpa - Fatal编程技术网

Java 如何在没有Spring的情况下启用hibernate字节码增强

Java 如何在没有Spring的情况下启用hibernate字节码增强,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个使用Hibernate/JPA的普通java项目。没有春天。没有J2EE。我想启用运行时字节码增强。 项目中已经有一个自定义类加载器,所以我想我可以使用org.hibernate.bytecode.spi.InstrumentedClassLoader.InstrumentedClassLoader(ClassLoader,ClassTransformer)。但是如何获得所需的ClassTransformer呢?还是我走错了方向?如果在javaagent的premain中添加一个Clas

我有一个使用Hibernate/JPA的普通java项目。没有春天。没有J2EE。我想启用运行时字节码增强。
项目中已经有一个自定义类加载器,所以我想我可以使用org.hibernate.bytecode.spi.InstrumentedClassLoader.InstrumentedClassLoader(ClassLoader,ClassTransformer)。但是如何获得所需的ClassTransformer呢?还是我走错了方向?

如果在javaagent的premain中添加一个ClassFileTransformerAdapter作为transformer,那么它就会工作。 (见附件)

需要“-javaagent:enhancer.jar”作为Vm参数

public class EnhancerMain {
  public static void premain(String agentArguments, Instrumentation instrumentation) {
    System.out.println("install enhancer");
    instrumentation.addTransformer(new ClassFileTransformerAdapter(new EnhancingClassTransformerImpl(new DefaultEnhancementContext())));
  }
}

public class ClassFileTransformerAdapter implements ClassFileTransformer {

  private final ClassTransformer classTransformer;

  public ClassFileTransformerAdapter(ClassTransformer classTransformer) {
    Objects.requireNonNull(classTransformer);
    this.classTransformer = classTransformer;
  }

  public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
    if (className.startsWith("java/")) {
      return null;
    }
    if (className.startsWith("sun/")) {
      return null;
    }
    if (className.startsWith("com/sun/")) {
      return null;
    }
    if (className.startsWith("javax/")) {
      return null;
    }
    try {
      byte[] transformed = this.classTransformer.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
      return transformed;
    } catch (IllegalClassFormatException e) {
      throw new IllegalStateException("Error enhancing class: " + className, e);
    }
  }
}

您试图解决的最初问题是什么?延迟加载oneToOne关系和使用自动收集管理可能是您的意思?没错。已编辑。您应该使用maven或gradle插件,如上面链接的文档所述。
Manifest-Version: 1.0
Premain-Class: com.enhancer.EnhancerMain