簡體   English   中英

如何在不是來自JNDI的JPA EntityMangerFactory上設置數據源

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM