如何让实体读取db配置

时间:2015-04-02 09:46:24

标签: java jpa architecture ejb

考虑需要读取某些数据库配置的实体的问题,以便设置一些值: 例如:

@entity
public class person{
int age,
String ageCategory;
}
设置年龄时,将从数据库中提取 ageCategory 。 我的问题是什么是最好的EJB架构,以便从数据库中读取 AgeCategoryConfiguration 。目前我正在使用 jndi 注入 AgeCategoryFacade ,这提供了一种从年龄开始获取 AgeCategory 的方法,此方法在年龄调用 setter

是否有更好的方法。

1 个答案:

答案 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");
        }
    }
}