考虑实体需要读取一些数据库配置才能设置一些值的问题:例如:
@entity
public class person{
int age,
String ageCategory;
}
设置age时,将从数据库中提取ageCategory。我的问题是,为了从数据库中读取AgeCategoryConfiguration,最好使用什么EJB体系结构。目前,我正在使用jndi注入AgeCategoryFacade,它提供了一种从年龄获取AgeCategory的方法,该方法在年龄setter中被调用。
有更好的方法吗。
也许您想看看jpaEvents。
您说过,当年龄设置为这个时,将从数据库中提取ageCategory,我认为这个语句符合@PostLoad注释。
如果你想了解更多,请阅读这篇漂亮的文章。通常,在注入ejb时不需要jndi路径。
编辑我会让事情尽可能简单。
所以您应该有一些bean,它在JSF中使用,并带有更新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..
}
}
接下来,您应该拥有负责Person的CRUD操作的PersonService:
@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");
}
}
}