package net.csdn.jpa.enhancer; import javassist.CtClass; import javassist.bytecode.AnnotationsAttribute; import javassist.bytecode.ConstPool; import javassist.bytecode.annotation.BooleanMemberValue; import net.csdn.bootstrap.Bootstrap; import net.csdn.common.settings.Settings; import net.csdn.enhancer.BitEnhancer; import net.csdn.enhancer.Enhancer; import org.hibernate.annotations.DynamicInsert; import javax.persistence.Entity; import java.io.DataInputStream; import java.util.ArrayList; import java.util.List; import static net.csdn.common.collections.WowCollections.map; /** * BlogInfo: WilliamZhu * Date: 12-6-26 * Time: 下午10:11 */ public class JPAEnhancer extends Enhancer { private Settings settings; private List<BitEnhancer> bitEnhancers = new ArrayList<BitEnhancer>(); public JPAEnhancer(Settings settings) { this.settings = settings; bitEnhancers.add(new PropertyEnhancer(settings)); bitEnhancers.add(new ClassMethodEnhancer(settings)); bitEnhancers.add(new InstanceMethodEnhancer(settings)); } public CtClass enhanceThisClass(DataInputStream dataInputStream) throws Exception { CtClass ctClass = classPool.makeClassIfNew(dataInputStream); if (!ctClass.subtypeOf(classPool.get("net.csdn.jpa.model.JPABase"))) { return ctClass; } // Enhance only JPA entities if (!hasAnnotation(ctClass, "javax.persistence.Entity")) { return ctClass; } //Warning: here stick to hibernate ConstPool constPool = ctClass.getClassFile().getConstPool(); AnnotationsAttribute attr = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag); createAnnotation(attr, Entity.class); createAnnotation(attr, org.hibernate.annotations.Entity.class, map("dynamicInsert", new BooleanMemberValue(true, constPool) )); createAnnotation(attr, DynamicInsert.class); ctClass.getClassFile().addAttribute(attr); //done return ctClass; } public void enhanceThisClass2(List<CtClass> ctClasses) throws Exception { for (BitEnhancer bitEnhancer : bitEnhancers) { for (CtClass ctClass : ctClasses) { // Bootstrap.isLoaded(ctClass.getName()); bitEnhancer.enhance(ctClass); } } } }