2012-04-30 1 views
3

2 가지 다른 데이터 소스가 있는데 두 가지 다른 PersistenceManagerFactory이 필요합니다. 이것은 항상 persistence.xml 파일을 작성함으로써 얻을 수 있습니다. 그러나 나는 이것이 프로그램 적으로 표현되기를 바랍니다. 두 번째 데이터 소스는 상대적으로 변경되지 않지만 첫 번째 데이터 소스는 플러그인을 통해 추가 될 수 있습니다. 이러한 플러그인에는 하나 이상의 JDO 주석 클래스가있을 수 있습니다. A persitance.xml은 런타임에로드되기를 원하기 때문에 여기서는별로 좋은 생각이 아닙니다.jdo : DataNucleus에 프로그래밍 방식으로 여러 지속성 단위를 생성하십시오.

Hibernate (와 JPA)에서는 설정 객체를 생성하고 주석이 달린 모든 클래스를 추가함으로써 가능하다. 새로운 플러그인이로드 될 때마다 언제든지 SessionFactory을 종료하고 @Entity 주석을보고 플러그인의 추가 클래스로 다시로드 할 수 있습니다.

DataNucleus/JDO에서 비슷한 방법이 있습니까?

Google에서 검색해 보았습니다 만, 결국 파일을 쓰는 방법을 설명하는 DataNucleus site에 있습니다.

+0

했는가 : 아래에서

private val pu = props(db.driver, db.url, db.username, db.password) private val pmf = JDOHelper.getPersistenceManagerFactory(pu.asJava) private val pm = pmf.getPersistenceManager.asInstanceOf[JDOPersistenceManager] 

은 아마 H2, MongoDBPostgreSQL의 경우 같은 맵을 채울 기꺼이하는 방법에 대한 예제를 볼 수 있습니까? 동적 데이터 소스가있는 entityManager를 만들고 싶습니다 ... – Alex

답변

0

스칼라의 아래 코드는 PersistenceManager을 동적으로 만드는 방법을 보여줍니다. 지도를 채우고 JDOHelper#getPersistenceManagerFactory에 전달하면됩니다. 당신은 그것을

def props(driver: String, url: String, username: String, password: String): Map[String, Any] = 
    driver match { 
     case "org.h2.Driver" => 
     Map[String, Any](
      "javax.jdo.option.Mapping"     -> "h2", 
      "datanucleus.schema.autoCreateAll"   -> "true", 
      "javax.jdo.PersistenceManagerFactoryClass" -> "org.datanucleus.api.jdo.JDOPersistenceManagerFactory", 
      "javax.jdo.option.ConnectionDriverName" -> driver, 
      "javax.jdo.option.ConnectionURL"   -> url, 
      "javax.jdo.option.ConnectionUserName"  -> username, 
      "javax.jdo.option.ConnectionPassword"  -> password 
     ) 

     case "org.postgresql.Driver" => 
     Map[String, Any](
      "datanucleus.schema.autoCreateAll"   -> "true", 
      "javax.jdo.PersistenceManagerFactoryClass" -> "org.datanucleus.api.jdo.JDOPersistenceManagerFactory", 
      "javax.jdo.option.ConnectionDriverName" -> driver, 
      "javax.jdo.option.ConnectionURL"   -> url, 
      "javax.jdo.option.ConnectionUserName"  -> username, 
      "javax.jdo.option.ConnectionPassword"  -> password, 
      "javax.jdo.option.RetainValues"   -> "true", 
      "javax.jdo.option.RestoreValues"   -> "true", 
      "javax.jdo.option.Optimistic"    -> "true", 
      "javax.jdo.option.NontransactionalWrite" -> "false", 
      "javax.jdo.option.NontransactionalRead" -> "true", 
      "javax.jdo.option.Multithreaded"   -> "true", 
      "javax.jdo.option.IgnoreCache"    -> "false" 
     ) 

     case "mongodb.jdbc.MongoDriver" => 
     Map[String, Any](
      "javax.jdo.option.Mapping"     -> "mongo", 
      "datanucleus.schema.autoCreateAll"   -> "true", 
      "javax.jdo.PersistenceManagerFactoryClass" -> "org.datanucleus.api.jdo.JDOPersistenceManagerFactory", 
      "javax.jdo.option.ConnectionDriverName" -> driver, 
      "javax.jdo.option.ConnectionURL"   -> url, 
      "javax.jdo.option.ConnectionUserName"  -> username, 
      "javax.jdo.option.ConnectionPassword"  -> password 
     ) 

     case _ => throw new IllegalArgumentException(s"unknown driver %s".format(driver)) 
    }