Java 编辑行并验证

Java 编辑行并验证,java,validation,jsf,ejb,Java,Validation,Jsf,Ejb,我想编辑数据表中的行,但我遇到了一个问题。我有一个验证器,它检查数据库中是否有社会保险号。当我添加时,一切都正常。问题发生在我编辑时。 下面是我的编辑页面中的代码片段: <h:form> <div id="userPanel"> <p:panel id="panelUser" header="Edytuj administratora" > <div id="panelImage">

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

<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>
方法find personalIdExist在找到编辑过程中给定的personalId时返回true,如果未找到,则返回false

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

名字:巴勃罗

姓氏:ABCD

个人识别码:12345678901

密码:zxcv

当我编辑个人ID时,一切正常,但我只能编辑
firstName
lastName
password
而不能编辑
personalId
<代码>个人ID可能相同。当我单击编辑时,我遇到了一个问题,因为如果id已经存在并且我无法更新我的用户,我的方法
personalIdExist
将返回
true

我需要在某个地方保存初始值personalId,以便该用户能够对其进行编辑。但不知道如何操作。

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

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

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

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

在这种情况下,我会说您有两种不同的用法,您应该使用两种不同的属性(
newPersonalId
editedPersonalId
),而不是试图混合使用它们

另一种方法是在bean中创建
exists
布尔属性;设置
personalId
将导致继续查找,如果数据库中已有
存在,则
属性将设置为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
方法。

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

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

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

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

在这种情况下,我会说您有两种不同的用法,您应该使用两种不同的属性(
newPersonalId
editedPersonalId
),而不是试图混合使用它们

另一种方法是在bean中创建
exists
布尔属性;设置
personalId
将导致继续查找,如果数据库中已有
存在,则
属性将设置为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
方法。

这是我对您的问题的解释

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

SJuan76方法是正确的。您不想让验证器为您执行该检查。相反,只需确保用户为PersonID输入您期望的值即可。然后,让持久层为您强制唯一性(无需编写您自己的逻辑)。我假设您使用的是ORM(但我不确定是哪一种),因此您的
UserMB
应该是这样的(我正在从头开始写伪代码)

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

用这个
    } else if ((user.getPersonalId() != null) && (userDao.findPersonalIdExist(user.getPersonalId()))) {
        sendErrorMessageToUser("Użytkownik z podanym numerem pesel istnieje w bazie");
        return null;
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
}
findPersonalIdExist(user.getPersonalId())
<h:inputHidden value="#{userMB.user.id}" />