当前位置: 首页 > 面试题库 >

在保留实体之前检查约束是否违反

夹谷茂
2023-03-14
问题内容

什么是防止在创建约束约束之前检查约束的最佳机制?实体的修改

假设“用户”实体具有“ loginid”作为唯一约束,明智的做法是在创建或修改之前检查是否已存在具有该loginid名称的用户条目。

要么

您是否要让数据库抛出ConstraintViolationException并在UI层中适当地处理此消息。在jboss接缝框架中应在哪里执行此类检查。

注意:目前,没有对seam-gen代码强制执行此类检查。

当前,我们将Seam 2.2,Richfaces与Hibernate结合使用。


问题答案:

即使您在保留用户对象之前检查代码中的条件,也始终有机会在您检查的时间和保留新用户之间有人创建重复的登录ID。

但是,如果您进行显式检查,则在UI中显示适当的错误消息会更加容易。如果您在表上有多个约束,则捕获ConstraintViolationException不会使您轻松确定违反了哪个约束。

所以我会两者都做。假设您要从Seam的EntityHome扩展:

  1. 在persist()方法中,运行查询以确保loginid是唯一的。如果不是,则向相应的控件添加错误消息,然后返回null。
  2. 包装对super.persist()的调用并捕获ConstraintViolationException,显示通用的重复错误消息

编辑

正如Shervin提到的那样,创建一个JSF验证器是一个好主意(取代上面的#1),但是您仍然应该期待最差的情况并捕获ConstraintViolationException。



 类似资料:
  • 我有一个迁移脚本之间的2个不同的模式数据库。脚本做了3件事:1。禁用约束2。将记录从旧架构插入到新架构3。启用约束 我发现这两个约束在旧的模式中是不存在的。这2个表的表结构定义有什么问题吗?

  • 问题内容: 我有一个带有列-ID,Property,Property_Value的SQL Server表RealEstate。该表大约有5到1千万行,并且将来还会增加。我只想在此表中不存在Id,Property,Property_Value的组合时插入行。 示例表- 不允许插入。但是,还可以。我很好奇,知道这样做的“最佳”方法和 原因 。为什么这部分对我来说最重要。两种检查方法是- 在应用程序级别

  • 主要内容:选取设置检查约束的字段,在创建表时设置检查约束,在修改表时添加检查约束,删除检查约束MySQL检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。 在《MySQL默认值》和《MySQL非空约束》中讲解的默认值约束和非空约束也可看作是特殊的检查约束。 选取设置检查约束的字段 检查约束使用 CHECK 关键字,具体的语法格式如下: C

  • 主要内容:Oracle Check约束简介在本教程中,您将学习如何使用Oracle检查约束来强制域(列)的完整性。 Oracle Check约束简介 Oracle检查约束允许通过限制一列或多列所接受的值来强制执行域完整性。 要创建一个检查约束,可以定义一个返回或的逻辑表达式。 Oracle使用此表达式来验证正在插入或更新的数据。 如果表达式的计算结果为,则Oracle接受数据并进行插入或更新。 否则,Oracle将拒绝这些数据,新数据根本

  • 问题内容: 我有以下情况。主表和许多其他表通过外键链接在一起。现在,当我想删除主表中的一行时,将会发生ConstraintsViolation,这是有目的的,也是很好的。 现在,我希望能够在触发删除行事件之前检查ConstraintsViolation是否会发生。 这可能吗? 问题答案:

  • 我有两个已经存在于postgres中的表,我们称之为表A和表B。表B的一列有一个外键约束,因为它必须是表A的主键。因此,B和A之间存在多对一的关系,表B中的多条记录对应于表A中的一条记录。 这两个表的实体定义如下。 表B的实体定义如下: 其中userId是映射到表a中的主键user_id的外键。这些约束已经在底层postgres数据库中定义了,所以我没有考虑使用@ManyToOne注释关系(仍然试