gpt4 book ai didi

java - hibernate 列唯一性问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:32 26 4
gpt4 key购买 nike

我仍在学习 hibernate/hql,我有一个问题,一半是最佳实践问题,一半是健全性检查。

假设我有一个 A 类:

@Entity
public class A
{
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@Column(unique=true)
private String name = "";

//getters, setters, etc. omitted for brevity
}

我想强制每个保存的 A 实例都有一个唯一的名称(因此有 @Column 注释),但我也希望能够处理已经保存了一个具有该名称的 A 实例的情况。我看到了两种方法:

1) 我可以捕获在 session.saveOrUpdate() 调用期间可能抛出的 org.hibernate.exception.ConstraintViolationException 并尝试处理它。

2) 在调用 session.saveOrUpdate() 之前,我可以查询在 DAO 中已经具有该名称的 A 的现有实例。

现在我倾向于方法 2,因为在方法 1 中我不知道如何以编程方式找出违反了哪个约束(A 中还有几个其他唯一成员)。现在我的 DAO.save() 代码大致如下所示:

public void save(A a) throws DataAccessException, NonUniqueNameException
{
Session session = sessionFactory.getCurrentSession();

try
{
session.beginTransaction();

Query query = null;

//if id isn't null, make sure we don't count this object as a duplicate
if(obj.getId() == null)
{
query = session.createQuery("select count(a) from A a where a.name = :name").setParameter("name", obj.getName());
}
else
{
query = session.createQuery("select count(a) from A a where a.name = :name " +
"and a.id != :id").setParameter("name", obj.getName()).setParameter("name", obj.getName());
}

Long numNameDuplicates = (Long)query.uniqueResult();
if(numNameDuplicates > 0)
throw new NonUniqueNameException();

session.saveOrUpdate(a);
session.getTransaction().commit();
}
catch(RuntimeException e)
{
session.getTransaction().rollback();
throw new DataAccessException(e); //my own class
}
}

我的处理方式是否正确? hibernate 能否以编程方式告诉我(即不是错误字符串)哪个值违反了唯一性约束?通过将查询与提交分开,我是在引发线程安全错误,还是安全?这通常是如何完成的?

谢谢!

最佳答案

我认为你的第二种方法是最好的。

为了能够捕获 ConstraintViolation 异常并确定是此特定对象引起的,您需要在调用 saveOrUpdate 后立即刷新 session 。如果您需要一次插入多个此类对象,这可能会带来性能问题。

即使您会在每次保存操作时测试名称是否已存在于表中,这仍然比每次插入后刷新更快。 (您可以随时进行基准测试以确认。)

这还允许您以可以从不同层调用“validator ”的方式构建代码。例如,如果此唯一属性是新用户的电子邮件,您可以从 Web 界面调用验证方法来确定电子邮件地址是否可接受。如果您选择第一个选项,则只有在尝试插入电子邮件后才能知道电子邮件是否可接受。

关于java - hibernate 列唯一性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2495798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com