0

我想在数据表中编辑我的行,但我遇到了问题。我有一个验证器,它检查数据库中是否有社会安全号码。当我添加一切正常。我在编辑时会出现问题。以下是我的编辑页面中的代码片段:

<h:form>
    <div id="userPanel">
        <p:panel id="panelUser" header="Edytuj administratora" >
            <div id="panelImage">
                <img src="./../../images/person4.png" alt="person" width="150px" height="130px"/>
            </div>
            <h:inputHidden value="#{userMB.user.id}" />
            <h:panelGrid columns="3">
                <p:outputLabel for="firstName" value="#{msg.firstName}"></p:outputLabel>
                <p:inputText id="firstName" value="#{userMB.user.firstName}" label="#{msg.firstName}" required="true">
                    <f:validator validatorId="firstNameValidator" />  
                    <p:ajax update="msgFristName" event="keyup" />  
                </p:inputText>  
                <p:message for="firstName" id="msgFristName"/> 

                <p:outputLabel for="lastName" value="#{msg.lastName}"></p:outputLabel>
                <p:inputText id="lastName" value="#{userMB.user.lastName}" label="#{msg.lastName}" required="true">
                    <f:validator validatorId="lastNameValidator" />   
                    <p:ajax update="msgLastName" event="keyup" /> 
                </p:inputText>  
                <p:message for="lastName" id="msgLastName"/> 

                <p:outputLabel for="personalId" value="#{msg.personalId}"></p:outputLabel>
                <p:inputText id="personalId" value="#{userMB.user.personalId}" label="#{msg.personalId}" required="true">
                    <f:validator binding="#{personalIdValidator}" />   
                    <p:ajax update="msgPersonalId" event="keyup" /> 
                </p:inputText>  
                <p:message for="personalId" id="msgPersonalId"/>

                <p:outputLabel for="password" value="#{msg.password}"></p:outputLabel>
                <p:inputText id="password" value="#{userMB.user.password}" label="#{msg.password}" required="true">
                    <f:validator validatorId="passwordValidator" />   
                    <f:attribute name="confirmPassword" value="#{confirmPassword}" />
                    <p:ajax update="msgPassword" event="keyup" /> 
                </p:inputText>  
                <p:message for="password" id="msgPassword"/>

                <p:outputLabel for="confirmPassword" value="#{msg.confirmPassword}"></p:outputLabel>
                <p:inputText id="confirmPassword" binding="#{confirmPassword}" label="#{msg.confirmPassword}" required="true">
                    <f:validator validatorId="passwordValidator" />   
                    <f:attribute name="confirmPassword" value="#{confirmPassword}" />
                    <p:ajax update="msgConfirmPassword" event="keyup" /> 
                </p:inputText>  
                <p:message for="confirmPassword" id="msgConfirmPassword"/>
            </h:panelGrid>
            <center><p:commandButton value="#{msg.edit}" action="#{userMB.editUser()}" ajax="false">
                    <f:param name="userRole" value="admin" />
                    <f:param name="active" value="true" />
                </p:commandButton>
                <p:commandButton value="#{msg.cancel}" action="#{userMB.cancel()}" ajax="false" immediate="true"/></center>
        </p:panel>
    </div>
</h:form>

当我想编辑用户时,我单击按钮:

<center><p:commandButton value="#{msg.edit}" action="#{userMB.editUser()}" ajax="false">

它调用方法editUser

public String editUser() {
    FacesContext context = FacesContext.getCurrentInstance();
    Map requestParameterMap = (Map) context.getExternalContext().getRequestParameterMap();
    try {
        String userRole = requestParameterMap.get("userRole").toString();
        String active = requestParameterMap.get("active").toString();
        Boolean act = Boolean.parseBoolean(active);
        user.setRole(userRole);
        user.setActive(act);
        if ((user.getEmail() != null) && (userDao.findEmailExist(user.getEmail()))) {
            sendErrorMessageToUser("Użytkownik z podanym adresem email istnieje w bazie");
            return null;
        } else if ((user.getPersonalId() != null) && (userDao.findPersonalIdExist(user.getPersonalId()))) {
            sendErrorMessageToUser("Użytkownik z podanym numerem pesel istnieje w bazie");
            return null;
        } else if ((user.getPhone() != null) && (userDao.findPhoneExist(user.getPhone()))) {
            sendErrorMessageToUser("Użytkownik z podanym numerem telefonu istnieje w bazie");
            return null;
        } else {
            userDao.update(user);
        }
    } catch (EJBException e) {
        sendErrorMessageToUser("Błąd edycji użytkownika w bazie");
        return null;
    }
    sendInfoMessageToUser("Konto zedytowane");
    return user.getRole() + "List";
}

方法find personalIdExist在找到编辑过程中给出的personalId时返回true,如果没有找到它返回false。

这是我的问题。当我编辑User我的编辑页面时,如下所示: 示例:

名字:巴勃罗

姓氏:ABCD

个人编号:12345678901

密码:zxcv

当我编辑我的personalId时,一切都很好,但我只能编辑firstNamelastNamepassword不能personalIdPersonalId可能是一样的。当我单击编辑时出现问题,因为如果 id 已经存在并且我无法更新我的用户,我的方法personalIdExist将返回。true我需要在某个地方保存该用户的初始值personalId,以便能够对其进行编辑。但不知道如何。

4

2 回答 2

2

据我了解,检查数据库中是否有重复的 id 是持久层的一部分,您不应该尝试在验证器中验证它。

使用验证器检查更正式的问题(数据格式、所需数据缺失等)。id重复的问题应该由业务逻辑控制或委托给持久层;没有问题,因为您将知道该操作是添加新用户还是修改现有用户。

如果您坚持为此使用验证器,请为每个问题创建一个特定的验证器(更新 apersonal或创建 a personal

更新:我想我明白你想要什么。您希望在将每个字符添加到 id 之后,根据数据库验证它是否已经存在,并且如果它已经存在则显示一条消息,不是吗?但有时该检查应该是一个错误(因为它引入了重复),而在其他情况下它不应该是一个错误(因为它正在查找一个数字)。我对吗?

在那种情况下,我会说你有两种不同的用法,你应该使用两个不同的属性(newPersonalIdeditedPersonalId),而不是试图混合它们。

另一种方法是在你的 bean 中创建一个exists布尔属性;设置personalId将导致查找继续进行,如果已经在数据库中,则该exists属性将设置为 true。在 XHTML 中,一些元素将基于此呈现/禁用;但这对我来说太复杂了。

UPDATE2:我还是不明白,如果用户已经存在,您正在积极阻止更新数据库,使用此代码

    } else if ((user.getPersonalId() != null) && (userDao.findPersonalIdExist(user.getPersonalId()))) {
        sendErrorMessageToUser("Użytkownik z podanym numerem pesel istnieje w bazie");
        return null;

持久层非常简单,只要记住这个阶段user是一个分离的实体,所以你需要使用EntityManager.merge方法。

于 2013-06-29T15:40:05.750 回答
1

这是我对你的问题的解释。

当您通过更改除了personalId之外的所有内容来编辑用户时,您会收到错误

SJuan76 方法是正确的方法。你不想让验证器为你做那个检查。相反,只需专注于确保用户像您期望的那样输入 personlId 的值。然后,让持久层为您强制执行唯一性(无需编写自己的逻辑)。我假设您使用的是 ORM(但我不确定是哪一个),所以您UserMB应该看起来像这样(伪代码,因为我正在脑海中写下)。

public class UserMB {

    private Long personalId; //Not sure what your actual type is 

    @Column(unique = true)//Uniqueness constraint
    public Long getPersonalId() { 
        return personalId; 
    }

    //Remainder omitted
}

如果您使用的是普通 SQL 或某些变体,请确保在创建表时为您的 personalId 列声明该唯一性约束。在这两种情况下,当您尝试更新您的UserMB personalId和其他人已经拥有它时,将引发异常。只需捕获它并将其作为错误消息返回。

通过此更改,您将不再需要在您的代码中使用以下方法

findPersonalIdExist(user.getPersonalId())

(顺便说一句,这是您问题的根本原因)如果您尝试更新,将会发生什么firstNamelastName 而不改变personalId一切都会顺利运行。如果您尝试编辑您的personalid 而其他人已经拥有它,则将不允许更新。

评论

这与您的具体问题无关,但我有点担心您的逻辑。您已经拥有下面的用户 ID(我猜这是您的 ORM 正在管理的用户 ID)。

<h:inputHidden value="#{userMB.user.id}" />

因此,您不应尝试通过将值作为参数传递来查找列(例如phoneNumber)是否存在。您应该直接根据他从数据库中的唯一性获取用户实例id,并验证他是否只是重新输入相同的信息。你可能会遇到问题。这是一个场景:

userA 想将电话号码从 123 更改为 345

userB 已有电话号码 345

即使用户 A 没有输入相同的值,您的代码也会返回 true(除非这是您想要的)。如果您确实希望每个人的字段都有唯一值,只需unique="true"在需要的地方添加。不需要所有这些检查。

您还可以null通过提供自己的转换器或设置一些参数来消除所有检查,faces-config以便所有提交的空字符串都将被解释为null. 请看下面的链接

绑定到 String 属性的 h:inputText 正在提交空字符串而不是 null

于 2013-06-29T20:36:26.377 回答