gpt4 book ai didi

java - Hibernate 复杂的唯一约束

转载 作者:行者123 更新时间:2023-11-28 23:11:12 26 4
gpt4 key购买 nike

我有一个具有以下唯一约束设置的实体类:

@Table(name = "foo", uniqueConstraints = {
@UniqueConstraint(columnNames = {"service", "system", "priority", "is_default"})})

其中service和system是其他实体类的外键,priority是一个整数,表示该条目在具有相同服务和系统对象的条目中的优先级,is_default是一个 boolean 值,表示默认配置条目。

这个独特的约束几乎完成了我想做的事情,但我需要的是一个设置,如果 is_default 是 FALSE 那么可以有多个条目具有相同的服务和系统 key 不同的整数优先级,而如果 is_default 为 TRUE,则给定的服务和系统 key 只能有 1 个条目,这意味着给定的服务和系统只能有 1 个默认条目。我怎样才能实现这样的约束?

最佳答案

关键是创建您自己的验证注释,能够根据特定条件验证行数据是否唯一。

让服务接口(interface)扩展 UniqueValidated 并实现执行验证的方法

public interface UniqueValidated {
boolean isUnique(Object value, String fieldName) throws UnsupportedOperationException;
}

public interface FooService extends UniqueValidated {
// add, delete...
}

public class FooServiceImpl implements FooService {

// add, delete...

@Override
public boolean isUnique(Object value, String fieldName)
throws UnsupportedOperationException {

// the logic of validation itself, feel free to use DAO implementations
}
}

创建您放置在映射属性上的注释。

@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE 
})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniqueValidator.class)
@Documented
public @interface Unique {
String message() default "{validation.unique}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends UniqueValidated> service();
String serviceQualifier() default "";
String fieldName();
}

最后创建带有注释的类处理。

public class UniqueValidator implements ConstraintValidator<Unique, Object> {

@Autowired
private ApplicationContext applicationContext;
private UniqueValidated service;
private String fieldName;

@Override
public void initialize(Unique unique) {
Class<? extends UniqueValidated> clazz = unique.service();
this.fieldName = unique.fieldName();
this.service = this.applicationContext.getBean(clazz);
}

@Override
public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
if (this.service == null || this.service.isUnique(o, this.fieldName)) {
constraintValidatorContext.disableDefaultConstraintViolation();
return true;
}
return false;
}
}

我从 JBoss Docs 上的在线教程中得到了启发。 .这是一个相当复杂的结构,但它能很好地引导结果。最大的优势无疑是您可以对任何实现 UniqueValidated 的服务进行自定义唯一验证。无论如何,您需要为您的项目定制上面的这些片段。

映射很简单:

@Unique(service = FooService.class, fieldName = "theNameOfThisField"
@Column(name = "...")
private String theNameOfThisField;

关于java - Hibernate 复杂的唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45940938/

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