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



考虑实体需要读取一些数据库配置才能设置一些值的问题:例如:

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

最新更新