2

我可以将所有实体或休眠注释从另一个 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中的任何实体导入我的项目?

4

1 回答 1

0

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

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

hibernate:在运行时创建实体(带注释) 我还附上了一些代码,虽然不完美,但可以让您的创意源源不断。它是基于 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 中的所有类,最常见的是使用 @Entity、@MappedSuperClass 和 @Embedded 注释的类。

  3. 使用 Hibernate 的configuration.addAnnotatedClass方法将这些类添加到您的休眠配置中

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

于 2013-07-19T08:31:27.483 回答