如何让实体读取数据库配置

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