我正在寻找一种在运行时定义JPA类的方法,并根据这些定义创建一个EntityManagerFactory。我一直在研究ORM 2.1模式,如果这种方法与此类似,那将是一件好事。 即而不是引用persitance.xml中的xml文件,我们将在引导EMF时提供具有相同定义的对象。
我对其他建议持开放态度,比如用Javassist创建类并将它们传递给bootstrapping过程。
这是一个OSGI项目,因此任何定义都将在运行时通过配置传递,也可以更新,即EMF和类应该能够在运行时被销毁和重新启动。
最好能够定义javax.validation注释或等效于字段。
这样的事情:
public EntityManagerFactory getEntityManagerFactory(Class<?> contextClass, PersistenceUnitInfo info,
Map<String, Object> properties) {
Entity user = new Entity("User"); //Class name
user.setId("USER_ID", Strategy.SEQUENCE);
Attribute userName = new Attribute();
userName.setName("name");
userName.setAttributeType("String");
Attribute userAge = new Attribute();
userAge.setName("age");
userAge.setAttributeType("Integer");
user.addAttribute(userName);
user.addAttribute(userAge);
Entity phoneNumber = new Entity("PhoneNumber");
phoneNumber.setId("PHONE_NUM_ID", Strategy.SEQUENCE);
Attribute phoneNumberNo = new Attribute();
phoneNumberNo.setName("phoneNumber");
phoneNumberNo.setAttributeType("Integer");
Attribute phoneToUser = new Attribute();
phoneToUser.setName("owner");
phoneToUser.setTargetEntity(user);
phoneToUser.setJoinColumn("USER_ID");
List<Entity> entities = new ArrayList();
entities.add(user);
entities.add(phoneNumber);
properties.put("entityMapping",entities);
EntityManagerFactory emf = persistenceProvider.createEntityManagerFactory( info, properties );
return emf;
}