从另一个maven存储库工件中获取所有hibernate注释/实体

时间:2013-06-30 12:31:43

标签: java hibernate maven

我可以将所有实体或hibernate注释从另一个maven存储库工件获取到我的项目吗?

在这种情况下,我想在我创建的工件中添加包中的所有实体。我发现的所有内容都是在persistence.xml文件中提供<class><jar-file>之类的设置。像:

<class>id.co.test.domain.Entity1</class>
<class>id.co.test.domain.Entity2</class>
<class>id.co.test.domain.Entity3</class>

因此该类将包含在我的项目中,而工件可能会被修改(无法使用<class>)或更改版本(无法使用<jar-file>

有没有办法将一个包id.co.test.domain中的任何实体导入我的项目?

1 个答案:

答案 0 :(得分:0)

您可以定义一个这样的过滤器(Spring,但您也可以使用其他库,或者您可以自己编写类扫描):

然后使用类扫描程序检索所有具有该注释的类并将它们添加到您的休眠配置中:

hibernate: create Entity(with annotations) in runtime 我还附上了一些代码,这些代码虽然不完美,但可以让你的创意变得流畅。它是基于Spring的,但在下面,我将在伪代码中总结这个想法。

private static final TypeFilter[] ENTITY_TYPE_FILTERS = new TypeFilter[] {
        new AnnotationTypeFilter(Entity.class, false),
        new AnnotationTypeFilter(Embeddable.class, false),
        new AnnotationTypeFilter(MappedSuperclass.class, false)};

private void scanPackages(Configuration conf, String... packagesToScan) throws HibernateException {
        try {
            for (String pkg : packagesToScan) {
                String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
                        ClassUtils.convertClassNameToResourcePath(pkg) + RESOURCE_PATTERN;
                Resource[] resources = resourcePatternResolver.getResources(pattern);
                MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(resourcePatternResolver);
                for (Resource resource : resources) {
                    if (resource.isReadable()) {
                        MetadataReader reader = readerFactory.getMetadataReader(resource);
                        String className = reader.getClassMetadata().getClassName();
                        if (matchesFilter(reader, readerFactory)) {
                            conf.addAnnotatedClass(resourcePatternResolver.getClassLoader().loadClass(className));
                        }
                    }
                }
            }
        }
        catch (IOException | ClassNotFouncException ex) {
            throw new MappingException("Failed to scan classpath for unlisted classes", ex);
        }
    }

基本上您应该按照以下步骤操作:

  1. 找到你引导休眠的地方。

  2. 找到一种方法来扫描外部jar中需要放入hibernate的所有类,这些类通常是使用@Entity,@ MapedSuperClass和@Embedded注释的类。

  3. 使用Hibernate的configuration.addAnnotatedClass方法将这些类添加到你的hibernate配置

  4. http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/cfg/Configuration.html#addAnnotatedClass(java.lang.Class)