12

アプリのconfフォルダーにpersistence.xmlを入れたいです。そこから読み取る必要があることを Persistence.createEntityManagerFactory に伝えるにはどうすればよいですか?

4

7 に答える 7

13

EclipseLink を使用している場合は、persistence.xml の場所を持続性ユニットのプロパティー「eclipselink.persistencexml」で設定できます。

properties.put("eclipselink.persistencexml", "/org/acme/acme-persistence.xml");
EntityManagerFactory factory = Persistence.createEntityManagerFactory("acme", properties);
于 2012-12-05T13:59:38.913 に答える
7

この解決策は私のために働いた

    Thread.currentThread().setContextClassLoader(new ClassLoader() {
        @Override
        public Enumeration<URL> getResources(String name) throws IOException {
            if (name.equals("META-INF/persistence.xml")) {
                return Collections.enumeration(Arrays.asList(new File("conf/persistence.xml")
                        .toURI().toURL()));
            }
            return super.getResources(name);
        }
    });
    Persistence.createEntityManagerFactory("test");
于 2012-12-21T06:17:58.383 に答える
2

createEntityManagerFactory メソッドは、CLASSPATH 要素の META-INF ディレクトリ内で persistence.xml ファイルを検索します。CLASSPATH に conf ディレクトリが含まれている場合、EntityManagerFactory 定義を conf/META-INF/persistence.xml に配置できます。

于 2012-12-05T06:34:58.960 に答える
1

ClassLoader は URLClassLoader である可能性があるため、次の方法で試してください。

        final URL alternativePersistenceXmlUrl = new File("conf/persistence.xml").toURI().toURL();

    ClassLoader output;

    ClassLoader current = Thread.currentThread().getContextClassLoader();

    try{

        URLClassLoader parent = (URLClassLoader)current;

        output = new URLClassLoader(parent.getURLs(), parent){

            @Override
            public Enumeration<URL> getResources(String name) throws IOException {

                if (name.equals("META-INF/persistence.xml")) {

                    return Collections.enumeration(Arrays.asList(alternativePersistenceXmlUrl));
                }

                return super.getResources(name);
            }
        };
    }catch(ClassCastException ignored) {

        output = new ClassLoader() {

            @Override
            public Enumeration<URL> getResources(String name) throws IOException {

                if (name.equals("META-INF/persistence.xml")) {

                    return Collections.enumeration(Arrays.asList(alternativePersistenceXmlUrl));
                }

                return super.getResources(name);
            }
        };
    }

それはうまくいくはずです。特定のテストなどの条件下で機能します。これはハックであり、本番環境では使用しないでください。

于 2016-08-27T14:45:30.780 に答える
0

プログラムの起動時に(メイン関数の最初の行で)これらの方法を試しました:

  • jar の resources/META-INF/persistence.xml に persistence.xml を書き込みます。

    私はこの方法で問題を抱えていました: Javaはリソースフォルダーに.txtファイルを書き込みます

  • jar ディレクトリに META-INF フォルダーを作成し、persistence.xml をそこに配置してから、次のコマンドを実行します。

    jar uf $jarName META-INF/persistence.xml

    このコマンドは、jar 内の META-INF/persistence.xml (ファイル) を置き換えます。

    private fun persistence() {
        val fileName = "META-INF/persistence.xml"
        val jarName: String?
        val done = try {
            jarName = javaClass.protectionDomain.codeSource.location.path
            if (File(fileName).exists() && !jarName.isNullOrBlank()
                    && jarName.endsWith(".jar") && File(jarName).exists()) {
                Command().exec("jar uf $jarName META-INF/persistence.xml", timeoutSec = 30)
                true
            } else false
        } catch (e: Exception) {
            false
        }
        if (done) {
            logger.info { "$fileName exist and will be loaded :)" }
        } else {
            logger.info {
                "$fileName not exist in current folder so it will be read from .jar :(" +
                        " you can run: jar uf jarName.jar META-INF/persistence.xml"
            }
        }
    }

Java でコマンドラインを実行する

于 2021-01-04T13:52:52.133 に答える