考虑实体需要读取某些数据库配置以设置某些值的问题: 例如:
@entity
public class person{
int age,
String ageCategory;
}
设置age时,将从数据库中获取ageCategory。 我的问题是,为了从数据库读取 AgeCategoryConfiguration,最好使用什么 EJB 架构。目前我正在使用jndi注入(inject)AgeCategoryFacade,它提供了一种从年龄获取AgeCategory的方法,该方法在age中调用 二传手。
有没有更好的方法。
最佳答案
也许您想查看jpa Events 。
您说过,当设置年龄时,将从数据库中获取ageCategory,我认为该语句适合 @PostLoad注解。
如果您想了解更多信息,请阅读this nice article 。通常,注入(inject) ejb 时不需要 jndi 路径。
编辑 我会让事情尽可能简单。
所以你应该有一些在 JSF 中使用的 bean 以及更新人员的方法:
@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);
}
}
请注意,您也可以在 createPerson、findPerson 等其他方法中使用ageCategoryFacade。
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");
}
}
}
关于java - 如何让实体读取数据库配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29409828/