[英]How to set a DataSource on a JPA EntityMangerFactory that is not from JNDI
我對JPA相當陌生,曾經使用過JDO(DataNucleus)和Hibernate。
我了解了如何為JPA配置設置persistence.xml
,但我需要進行一些調整。 我想在EntityManagerFactory
提供實際的DataSource
對象,而不是在XML中指定DataSource
。 之所以需要這樣做,是因為我創建和管理自己的DataSource
對象,並且不依賴於容器來執行此操作,因此,我不能(也不希望)通過persistence.xml
的JNDI名稱查找DataSource
。
因此,如何將DataSource
對象提供給EntityManagerFactory
而不是在persistence.xml
指定它? 我無法想象很難做到,但似乎找不到,而且我到處都看了。
如果有幫助,我將使用Hibernate 4作為JPA提供程序(實際上,我正在從3.6過渡到Ejb3Configuration
類消失的4)。 希望我可以以非Hibernate特定的方式進行操作,但是如果我必須使用Hibernate特定的API的話,這並不是什么大問題。
謝謝!!!
-Ryan
我自己想不出任何辦法,所以我用Spring來做。 這並不一定很糟,除了它需要我進口六個以前不打算使用的罐子外。 我最終還是將它們用於其他用途,但是,我仍然認為JPA的真正失敗是,它甚至不能使用API來設置數據源,而必須依賴於容器提供的數據源。
我用Spring的LocalContainerEntityManagerFactoryBean
來完成這項工作。 它從persistence.xml
讀取配置數據,然后我通過Spring API設置DataSource
。 Spring使用DataSource
覆蓋persistence.xml
中定義的內容。
代碼如下所示。 請注意對afterPropertiesSet
方法的調用。 這是必需的,因為我的應用程序不將Spring用於依賴項注入或AOP,而是將Guice用於這些任務。 如果不調用afterPropertiesSet
方法,則對getNativeEntityManagerFactory
的調用將返回null。
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setPersistenceUnitName("persistenceUnitName");
factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factoryBean.afterPropertiesSet();
EntityManagerFactory factory = factoryBean.getNativeEntityManagerFactory();
如果您不使用Spring,則可以直接執行以下操作:
Map<String, Object> props = new HashMap<String, Object>();
props.put("javax.persistence.nonJtaDataSource", createDataSource());
props.put("javax.persistence.transactionType", "RESOURCE_LOCAL");
EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnitName", props);
屬性javax.persistence.nonJtaDataSource
被記錄為JNDI URL,但使用Hibernate 5.1.4.Final可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.