考虑需要读取某些数据库配置的实体的问题,以便设置一些值: 例如:
@entity
public class person{
int age,
String ageCategory;
}
设置年龄时,将从数据库中提取 ageCategory 。
我的问题是什么是最好的EJB架构,以便从数据库中读取 AgeCategoryConfiguration 。目前我正在使用 jndi 注入 AgeCategoryFacade ,这提供了一种从年龄开始获取 AgeCategory 的方法,此方法在年龄调用 setter 。
是否有更好的方法。
答案 0 :(得分:1)
也许你想看看jpa Events。
您声明,当年龄设置为此时,将从数据库中提取 ageCategory ,并且我认为此语句符合@PostLoad注释。
如果您想了解更多阅读this nice article。通常你在注入ejbs时不需要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);
}
}
请注意,您也可以在其他方法中使用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");
}
}
}