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}" />