验证拦截器在多线程 Impex 中不起作用
Validate Interceptor not working in Multi Threaded Impex
SAP 商务 1811
Impex -
INSERT_UPDATE Calendar ; code[unique=true] ; name[lang=en] ; year ; active[default=false]
; 10001 ; 2021 Public Holiday ; 2021 ; true
; 10002 ; 2021 Holiday ; 2021 ; true
我创建了一个验证拦截器,它将确保一次只能激活一个日历。这意味着我们不能在同一年激活两个以上的日历。
final CalendarModel cal = calendarService.getActiveCalendar(calendar.getYear());
if (cal != null && !cal.equals(calendar))
{
throw new InterceptorException(
String.format("Only one Calendar can be active at a time for year %s", calendar.getYear()));
}
在此 Impex 中,我插入了两个 active=true 的日历,并期望为其中一个条目提供验证异常。
因为在这个用例中,一个条目依赖于另一个条目,所以在多线程的情况下它不会工作(因为顺序没有定义)。
如果最大。 threads 设置为大于 1,并且我 运行 impex,验证不工作。我尝试用 1 个线程导入这个 impex,然后只有验证工作。
有什么办法可以解决这个问题吗?
你不能用拦截器解决这个问题。拦截器根本不是线程安全的。它们不是为了验证对象是否已经存在而构建的。拦截器旨在独立于其他对象验证将要保存的对象。
这是一个需要在数据库上解决的问题,而不是在您的代码中。您需要在 CalendarModel 的 table 上添加 SQL constraint
(更具体地说是 SQL CHECK
约束)。此限制应验证您对每年 1 个活动项目的要求。
如何编写该约束将取决于您的数据库。要添加它,您可以直接在数据库中添加约束,尽管更新系统可能会再次删除它(我没有验证这一点,但它发生在索引中)。或者,您可以 运行 在初始化期间使用 alter table 语句来创建约束。
使用此约束,将在非法项目上引发数据库错误。当 运行 impex
时,这将在结果中可见
SAP 商务 1811
Impex -
INSERT_UPDATE Calendar ; code[unique=true] ; name[lang=en] ; year ; active[default=false]
; 10001 ; 2021 Public Holiday ; 2021 ; true
; 10002 ; 2021 Holiday ; 2021 ; true
我创建了一个验证拦截器,它将确保一次只能激活一个日历。这意味着我们不能在同一年激活两个以上的日历。
final CalendarModel cal = calendarService.getActiveCalendar(calendar.getYear());
if (cal != null && !cal.equals(calendar))
{
throw new InterceptorException(
String.format("Only one Calendar can be active at a time for year %s", calendar.getYear()));
}
在此 Impex 中,我插入了两个 active=true 的日历,并期望为其中一个条目提供验证异常。
因为在这个用例中,一个条目依赖于另一个条目,所以在多线程的情况下它不会工作(因为顺序没有定义)。
如果最大。 threads 设置为大于 1,并且我 运行 impex,验证不工作。我尝试用 1 个线程导入这个 impex,然后只有验证工作。
有什么办法可以解决这个问题吗?
你不能用拦截器解决这个问题。拦截器根本不是线程安全的。它们不是为了验证对象是否已经存在而构建的。拦截器旨在独立于其他对象验证将要保存的对象。
这是一个需要在数据库上解决的问题,而不是在您的代码中。您需要在 CalendarModel 的 table 上添加 SQL constraint
(更具体地说是 SQL CHECK
约束)。此限制应验证您对每年 1 个活动项目的要求。
如何编写该约束将取决于您的数据库。要添加它,您可以直接在数据库中添加约束,尽管更新系统可能会再次删除它(我没有验证这一点,但它发生在索引中)。或者,您可以 运行 在初始化期间使用 alter table 语句来创建约束。
使用此约束,将在非法项目上引发数据库错误。当 运行 impex
时,这将在结果中可见