如何让实体读取数据库配置
how to let entity read db configuration
考虑实体需要读取一些数据库配置以便设置一些值的问题:
例如:
@entity
public class person{
int age,
String ageCategory;
}
ageCategory 将在设置 age 时从数据库中获取。
我的问题是,为了从数据库中读取 AgeCategoryConfiguration,最好使用什么 EJB 架构。目前我正在使用 jndi 注入 AgeCategoryFacade ,它提供了一种从年龄中获取 AgeCategory 的方法,这方法在 age setter.
中被调用
有没有更好的方法。
也许您想看看 jpa Events。
你说 ageCategory 将在设置年龄时从数据库中获取,我认为这个陈述符合 @PostLoad 注释。
如果您想了解更多信息,请阅读 this nice article。通常在注入 ejbs 时不需要 jndi 路径。
编辑
我会让事情尽可能简单。
所以你应该有一些在 JSF 中使用的 bean 以及更新 person 的方法:
@Named
@SessionScoped
public class PersonController {
@Inject
private PersonService personService;
private Person selectedPerson;
/**
* Method for updating.
*/
public void updatePerson(ActionEvent actionEvent){
Person updatedPerson = personService.update(selectedUser);
// pass updatedPerson to presentation layer..
}
}
接下来你应该有 PersonService 来处理 Person 的 CRUD operations:
@Stateless
@LocalBean
public class PersonService {
@PersistenceContext
private EntityManager em;
@Inject
private AgeCategoryFacade ageCategoryFacade;
public Person updatePerson(Person person) {
// use ageCategoryFacade somehow to set ageCategory for example:
String ageCategory = ageCategoryFacade.getAgeCategory(person.getAge());
person.setAgeCategory(ageCategory);
return (Person) em.merge(person);
}
}
请注意,您也可以在 其他方法 中使用 ageCategoryFacade,例如 createPerson、findPerson。
JPA 事件的解决方案涉及实体 Bean 中的 PostLoad(或 PrePersist)方法:
@Entity
public class Person {
int age;
String ageCategory;
/**
* Simple setting of ageCategory.
*/
@PostLoad
public void postLoadPerson {
if(age < 10) {
setAgeCategory("A");
} else if (age < 30) {
setAgeCategory("B");
} else {
setAgeCategory("C");
}
}
}
考虑实体需要读取一些数据库配置以便设置一些值的问题: 例如:
@entity
public class person{
int age,
String ageCategory;
}
ageCategory 将在设置 age 时从数据库中获取。 我的问题是,为了从数据库中读取 AgeCategoryConfiguration,最好使用什么 EJB 架构。目前我正在使用 jndi 注入 AgeCategoryFacade ,它提供了一种从年龄中获取 AgeCategory 的方法,这方法在 age setter.
中被调用有没有更好的方法。
也许您想看看 jpa Events。
你说 ageCategory 将在设置年龄时从数据库中获取,我认为这个陈述符合 @PostLoad 注释。
如果您想了解更多信息,请阅读 this nice article。通常在注入 ejbs 时不需要 jndi 路径。
编辑 我会让事情尽可能简单。
所以你应该有一些在 JSF 中使用的 bean 以及更新 person 的方法:
@Named
@SessionScoped
public class PersonController {
@Inject
private PersonService personService;
private Person selectedPerson;
/**
* Method for updating.
*/
public void updatePerson(ActionEvent actionEvent){
Person updatedPerson = personService.update(selectedUser);
// pass updatedPerson to presentation layer..
}
}
接下来你应该有 PersonService 来处理 Person 的 CRUD operations:
@Stateless
@LocalBean
public class PersonService {
@PersistenceContext
private EntityManager em;
@Inject
private AgeCategoryFacade ageCategoryFacade;
public Person updatePerson(Person person) {
// use ageCategoryFacade somehow to set ageCategory for example:
String ageCategory = ageCategoryFacade.getAgeCategory(person.getAge());
person.setAgeCategory(ageCategory);
return (Person) em.merge(person);
}
}
请注意,您也可以在 其他方法 中使用 ageCategoryFacade,例如 createPerson、findPerson。
JPA 事件的解决方案涉及实体 Bean 中的 PostLoad(或 PrePersist)方法:
@Entity
public class Person {
int age;
String ageCategory;
/**
* Simple setting of ageCategory.
*/
@PostLoad
public void postLoadPerson {
if(age < 10) {
setAgeCategory("A");
} else if (age < 30) {
setAgeCategory("B");
} else {
setAgeCategory("C");
}
}
}