在NHibernate中处理异常的最佳实践是什么?
我有一个带有以下内容的SubjectRepository:
public void Add(Subject subject)
{
using (ISession session = HibernateUtil.CurrentSession)
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(subject);
transaction.Commit();
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试如下:
[Test]
public void TestSaveDuplicate()
{
var subject = new Subject
{
Code = "En",
Name = "English"
};
_subjectRepository.Add(subject);
var duplicateSubject = new Subject
{
Code = "En",
Name = "English1"
};
_subjectRepository.Add(duplicateSubject);
}
Run Code Online (Sandbox Code Playgroud)
我已经到了处理单元测试产生的错误并且有点卡住的问题.这会按预期失败,但是使用GenericADOException时,我期待一个ConstraintViolationException或类似的东西(在数据库级别的主题代码上存在唯一性约束).
ADOException包含一个MySQL Exception,它有一个明智的错误消息,但我不想通过抛出内部异常来开始破解封装.特别是因为MySQL没有最终确定为该项目的后端.
理想情况下,我希望能够捕获异常并在此时向用户返回合理的错误.是否有任何记录的最佳实践方法来处理NHibernate Exceptions并向用户报告出错的原因以及原因?
谢谢,
马特
我是Hibernate和DBs的新手,所以请原谅这个基本问题.
我正在使用DIS协议,特别是DIS的Open-DIS实现.在DIS中,每个EntityStatePdu(包含模拟中实体的状态)都有一个EntityId对象,一个3个整数的元组.我想将此对象用作自然ID,并保持标准的代理ID.我的问题是我无法弄清楚如何确保DB确定给定的EntityId已经存在并使用该EntityId的主键作为EntityStatePdu中的外键.
换句话说,假设我有两个EntityStatePdus,EntityID(1,2,3); 即我们有来自同一实体的两个更新.我想要的东西如下:
表:
entity_id
pk site app entity
0 1 2 3
entity_state_pdu
pk entity_id_fk timestamp
0 0 1
1 0 2
Run Code Online (Sandbox Code Playgroud)
以下是我正在测试的简化类:
@Entity
public class TestEntity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@NaturalId
@ManyToOne(cascade = CascadeType.ALL)
private TestId naturalId;
public Long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public TestId getNaturalId() {
return naturalId;
}
public void setNaturalId(TestId naturalId) {
this.naturalId = naturalId;
}
}
Run Code Online (Sandbox Code Playgroud)
和
@Entity
public …Run Code Online (Sandbox Code Playgroud) 我收到一个我无法理解的错误.错误非常简单:
ORA-00001: unique constraint (*schema*.*xyz_constraint*) violated
Run Code Online (Sandbox Code Playgroud)
然而,造成我困惑的是事实上似乎不存在这样的约束.它当然没有在桌子上定义; 有问题的DB几乎没有定义参照完整性,我插入数据的特定表没有定义键.
对于它的价值,我无法在数据库中的任何位置找到约束:
select *
from all_constraints
where constraint_name like '%xyz_constraint%'
Run Code Online (Sandbox Code Playgroud)
有什么我可以忽略的吗?谢谢.
我有一个看起来像这样的表:
ClientId FloorNum BedNum IsActive
11 2 212 1
12 2 214 0
12 2 214 1
13 2 215 0
13 2 215 0
13 2 215 0
13 2 215 0
13 2 215 1
12 2 215 1
Run Code Online (Sandbox Code Playgroud)
如您所见,FloorNum/BedNum组合2/215有两行,其中IsActive等于1.这不可能发生.
另一方面,一个FloorNum/BedNum组合可以有许多行,其中IsActive等于0.
如何向表中添加约束,以便FloorNum/BedNum组合只能有一行IsActive = 1?
任何帮助表示赞赏.
默认情况下唯一约束是索引吗?如果不是,那么在SELECT ... WHERE子句中使用唯一约束时是否具有与索引列相同的性能结果?
谢谢
mysql performance database-design unique-constraint database-indexes
我有一个 DAO,我需要在其中捕获唯一的约束异常。为此,唯一可行的解决方案是在持久化之后刷新我的 EntityManager。只有这样我才能进入一个catch块,我必须过滤掉异常。而且,我的 DAO 方法需要包含在一个事务中(REQUIRES_NEW),否则我会遇到 RollBackException。
难道我做错了什么?
try {
em.persist(myObject);
em.flush();
} catch (PersistenceException ex) {
if (ex.getCause() != null) {
String cause = ex.getCause().toString();
if (cause != null) {
if (cause.contains("org.hibernate.exception.ConstraintViolationException")) {
logger
.error("org.hibernate.exception.ConstraintViolationException: possible unique constraint failure on name");
throw ex;
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 在我的表中,我有一个独特的约束。在休眠中,当我添加一个违反该约束的项目时,我想捕获它,因此它将更新而不是创建一个项目。
当我没有设置 try-catch 块时
updated = query.executeUpdate();
Run Code Online (Sandbox Code Playgroud)
它得到以下错误
Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation: WEEKROOSTERITEMUNI
Run Code Online (Sandbox Code Playgroud)
当我设置以下 try-catch 块时
try {
updated = query.executeUpdate();
}
catch(PersistenceException e){
LOG.debug("this is PersistenceException exception throw");
}
Run Code Online (Sandbox Code Playgroud)
它收到以下错误
Caused by: javax.persistence.RollbackException: Transaction marked as rollbackOnly
Run Code Online (Sandbox Code Playgroud)
当我捕获“ConstraintViolationException”时,我只是不断收到约束异常,它没有捕获任何东西。
Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation: WEEKROOSTERITEMUNI
Run Code Online (Sandbox Code Playgroud)
我怎么能抓住这个?
hibernate exception rollback unique-constraint hibernateexception
我有一个对 3 个字段具有唯一约束的实体。
2 个字段不可为空,第三个字段可以为空。
我的问题,当第三个字段为空时,唯一约束不起作用,所以我可以在我的数据库中有一些重复的值,比如 (5,1,null)(5,1,null)
对我来说, (5,1,null)是一个独特的值,也有 null。
你有什么想法 ?
这是我的 ORM 线:
* @ORM\Table(name="table", uniqueConstraints={@ORM\UniqueConstraint(name="table_idx", columns={"field1", "field2", "field3"})})
Run Code Online (Sandbox Code Playgroud)
编辑:可为空值是其他实体的外键,所以我不能放置自定义值。它是一个实体或空值。
我试图弄清楚为什么字段的“唯一”约束不起作用。我正在使用 Flask、SQLAlchemy 和 Sqlite。
考虑模型:
from app import db
from flask_login import UserMixin
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True)
password = db.Column(db.String(64))
email = db.Column(db.String(120), unique=True)
def __repr__(self):
return '<User %r>' % self.username
Run Code Online (Sandbox Code Playgroud)
我希望,由于用户名字段有一个唯一约束,它不允许我添加具有相同用户名的用户。不过,确实如此。
从外壳:
from app import db
from app.models import User
user = User(username='test')
user2 = User(username='test')
db.session.add(user)
db.session.commit()
db.session.add(user2)
db.session.commit()
User.query.all()
Run Code Online (Sandbox Code Playgroud)
输出:
[<User 'test'>, <User 'test'>]
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我有一个这样的表:
\n\nCREATE TABLE schema.mytable\n(\n id serial NOT NULL,\n number integer NOT NULL,\n state boolean NOT NULL,\n);\nRun Code Online (Sandbox Code Playgroud)\n\n我需要创建一组唯一的 \xc2\xb4number\xc2\xb4 但是,状态列必须为 true;如果状态列为假,则数字可以重复,这是我需要有效的示例:
\n\nid number state\n1 123 true\n2 124 true\n3 125 true\n4 123 false\n5 129 false\nRun Code Online (Sandbox Code Playgroud)\n\n如您所见,数字 123 被重复,但在一种情况下状态为 false,另一种情况为 true;这是不正确的:
\n\nid number state\n1 123 true\n2 124 true\n3 125 true\n4 123 true (*incorrect)\n5 129 false\nRun Code Online (Sandbox Code Playgroud)\n\n另外,123也有可能以错误状态重复两次或更多次;我怎样才能实现这个目标?
\nsql ×3
exception ×2
hibernate ×2
java ×2
orm ×2
jpa ×1
jpa-2.0 ×1
mysql ×1
nhibernate ×1
oracle ×1
oracle10g ×1
performance ×1
postgresql ×1
python ×1
rollback ×1
sql-insert ×1
sql-server ×1
sqlalchemy ×1
symfony ×1
t-sql ×1