2011-11-14 9 views
5

いくつかのパッケージに含まれるすべてのクラスをループする方法はありますか? AnnotationConfigurationにはaddAnnotatedClass(Class c)が必要です。このようにそれをやって :私のテーブルの一部のパッケージにすべてのクラスを追加して、注釈付きクラスをHibernateに追加します。 JAVA

AnnotationConfiguration annotationConfiguration.addAnnotatedClass(AdditionalInformation.class); 
    annotationConfiguration.addAnnotatedClass(AdditionalInformationGroup.class); 
    annotationConfiguration.addAnnotatedClass(Address.class); 
    annotationConfiguration.addAnnotatedClass(BankAccount.class); 
    annotationConfiguration.addAnnotatedClass(City.class); 
    //et cetera 

すべてがパッケージTables.Informationsです。

+1

春またはjpaを使用していますか? – Bozho

答えて

13

コメントに記載されているとおり、パッケージ内のすべてのクラスを読み込む機能は、AnnotationConfiguration APIでは使用できません。上記のAPIでできることはいくつかあります(「addPackage」メソッドは、package-info.javaクラスにあるようなパッケージメタデータのみを読み込み、パッケージ内のすべてのクラスをロードしません)。

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/ch01.html

sessionFactory = new AnnotationConfiguration() 
        .addPackage("test.animals") //the fully qualified package name 
        .addAnnotatedClass(Flight.class) 
        .addAnnotatedClass(Sky.class) 
        .addAnnotatedClass(Person.class) 
        .addAnnotatedClass(Dog.class) 
        .addResource("test/animals/orm.xml") 
        .configure() 
        .buildSessionFactory(); 
+3

あなたのユーティリティクラスのクラス名を焼かなければならないという問題は、どのように地球上で解決されますか? (キーストロークを保存するだけです)。 – vbence

+3

@vbenceはい、合意しました。申し訳ありませんが、私の答えは間違っています.AnotationConfiguration APIを使用して1つのパッケージからすべてのクラスを1つのパッケージに追加する方法はありません。この例では、これを行うことができると同時に、個々のクラスやその他のリソースをすべて一度に追加できることを示しています。私は基本的に、ここで議論されたものと同じ誤解を持っています:https://forum.hibernate.org/viewtopic.php?f=1&t=980723私は私の投稿を削除することができたらいいのに、それは受け入れられた答えです。 –

+2

ああ、私はそれを読んだ(フォーラムの投稿)。たぶんあなたは* "OPの原作が望んだものは不可能ですが、この構文はちょっとしたことに役立ちます*などのようなメモを追加することができます。 – vbence

1

次のコードは、指定したパッケージ内のすべてのクラスを経て、「@Entity」と注釈を付けたもののリストを作ります。これらの各クラスは、すべて明示的にリストすることなく、Hibernateのファクトリ設定に追加されます。

public static void main(String[] args) throws URISyntaxException, IOException, ClassNotFoundException { 
    try { 
     Configuration configuration = new Configuration().configure(); 
     for (Class cls : getEntityClassesFromPackage("com.example.hib.entities")) { 
      configuration.addAnnotatedClass(cls); 
     } 
     sessionFactory = configuration.buildSessionFactory(); 
    } catch (Throwable ex) { 
     System.err.println("Failed to create sessionFactory object." + ex); 
     throw new ExceptionInInitializerError(ex); 
    } 
} 

public static List<Class<?>> getEntityClassesFromPackage(String packageName) throws ClassNotFoundException, IOException, URISyntaxException { 
    List<String> classNames = getClassNamesFromPackage(packageName); 
    List<Class<?>> classes = new ArrayList<Class<?>>(); 
    for (String className : classNames) { 
     Class<?> cls = Class.forName(packageName + "." + className); 
     Annotation[] annotations = cls.getAnnotations(); 

     for (Annotation annotation : annotations) { 
      System.out.println(cls.getCanonicalName() + ": " + annotation.toString()); 
      if (annotation instanceof javax.persistence.Entity) { 
       classes.add(cls); 
      } 
     } 
    } 

    return classes; 
} 

public static ArrayList<String> getClassNamesFromPackage(String packageName) throws IOException, URISyntaxException, ClassNotFoundException { 
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    ArrayList<String> names = new ArrayList<String>(); 

    packageName = packageName.replace(".", "/"); 
    URL packageURL = classLoader.getResource(packageName); 

    URI uri = new URI(packageURL.toString()); 
    File folder = new File(uri.getPath()); 
    File[] files = folder.listFiles(); 
    for (File file: files) { 
     String name = file.getName(); 
     name = name.substring(0, name.lastIndexOf('.')); // remove ".class" 
     names.add(name); 
    } 

    return names; 
} 

参考参照:https://stackoverflow.com/a/7461653/7255

0

あなたはscanPackagesプロパティを指定することができますセッションファクトリを構築するためのLocalSessionFactoryBuilderを使用することができます。

SessionFactory sessionFactory = new LocalSessionFactoryBuilder(hikariDataSource()) 
     .scanPackages("com.animals.entities") 
     .addProperties(properties) 
     .buildSessionFactory(); 
関連する問題