Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jOOQ:允许的字符约束?_Java_Jooq - Fatal编程技术网

Java jOOQ:允许的字符约束?

Java jOOQ:允许的字符约束?,java,jooq,Java,Jooq,我正在考虑从Hibernate迁移到jOOQ,但我找不到。 如何在Hibernate中对字符串进行模式约束: @NotEmpty(message = "Firstname cannot be empty") @Pattern(regexp = "^[a-zA-Z0-9_]*$", message = "First Name can only contain characters.") private String firstname; 在jOOQ中我将如何做到这一点?以“jOOQ方式” 进行此

我正在考虑从Hibernate迁移到jOOQ,但我找不到。 如何在Hibernate中对
字符串
进行模式约束:

@NotEmpty(message = "Firstname cannot be empty")
@Pattern(regexp = "^[a-zA-Z0-9_]*$", message = "First Name can only contain characters.")
private String firstname;
在jOOQ中我将如何做到这一点?

以“jOOQ方式” 进行此类验证的“jOOQ方法”是创建:

  • 数据库中的
    检查
    约束
  • 数据库中的触发器
  • 数据库中的域
毕竟,如果您希望确保数据完整性,那么数据库就是此类约束和完整性检查所属的位置(可能除了功能等效的客户端验证之外)。设想一个批处理作业、一个Perl脚本,甚至是一个绕过JSR-303验证的JDBC语句。您很快就会发现自己的数据已损坏

如果您确实想要实现客户端验证,您仍然可以在DTO上使用JSR-303,例如,它可以与UI交互。但是,在将数据传递给jOOQ进行存储()之前,必须执行验证

使用
转换器
但是,您可以通过在单个列上声明一个
转换器来使用自己的自定义类型

本质上,转换器是:

public interface Converter<T, U> extends Serializable {
    U from(T databaseObject);
    T to(U userObject);
    Class<T> fromType();
    Class<U> toType();
}
公共接口转换器扩展了可序列化{
U from(T数据库对象);
T到(U用户对象);
类fromType();
类toType();
}
在您的情况下,您可以实现如下注释:

public class NotEmptyAlphaNumericValidator implements Converter<String, String> {

    // Validation
    public String to(String userObject) {
        assertNotEmpty(userObject);
        assertMatches(userObject, "^[a-zA-Z0-9_]*$");
        return userObject;
    }

    // Boilerplate
    public String from(String databaseObject) { return databaseObject; }
    public Class<String> fromType() { return String.class; }
    public Class<String> toType() { return String.class; }
}
public类notemptyalphanumericvidator实现转换器{
//验证
公共字符串到(字符串用户对象){
assertNotEmpty(userObject);
assertMatches(userObject,“^[a-zA-Z0-9\]*$”;
返回userObject;
}
//样板
来自(字符串数据库对象){return databaseObject;}的公共字符串
公共类fromType(){return String.Class;}
公共类toType(){return String.Class;}
}
请注意,这更多的是一种变通方法,因为
转换器
并不是为这个用例设计的,即使它可以完美地实现它

使用正式的客户端验证
还有一个待定的特性请求,需要添加更多对客户端验证的支持。从JOOQ3.7开始,这还没有实现。

我建议您不要尝试以“hibernate/JPA”的方式使用jOOQ。让jOOQ生成的类保持原样,并手动映射到您自己的域类,您可以随意对其进行注释。然后,您可以在尝试持久化JSR验证程序之前调用它们

例如,jOOQ可能会生成以下类

public class BookRecord extends UpdatableRecordImpl<BookRecord> {

    private String firstname;

    public void setId(Integer value) { /* ... */ }

    public Integer getId() { /* ... */ }

}
在DAO层中检索到
BookRecord
,然后手动映射

Book book = new Book();
book.setId(bookRecord.getId());
book.setFirstname(bookRecord.getFirstname());

这看起来相当乏味(ORM试图让您省去这一繁琐),但实际上,在我看来,它可以很好地扩展到复杂的域对象,并且很容易理解应用程序中的数据流。

我认为您可能误解了JOOQ的含义。JOOQ不是关于验证bean wrt的。JSR-303(bean验证)标准。它只是不打算为你这么做。。。Hibernate就是这么做的。但这不是O/R的强制性要求-Mappers@Vogel612哦,好吧,我不知道。我认为这是理所当然的,因为Hibernate使用其实体上的注释为我做到了这一点。我对设计数据库的库不是很有经验。你知道我将如何实施这些检查吗?这是在DAO层实现的常见做法,还是我完全弄错了?嗨!因此,基本上我可以使用验证器或转换器,但我应该使用[pattern matching]8http://www.postgresql.org/docs/current/static/functions-matching.html)例如像
这样的PostgreSQL。感谢您提供的
转换器
示例,但我非常确定我真的应该进行数据库级验证!我会使用这样一个
转换器
来使用乔达时间是的,在
检查
约束中进行模式匹配听起来像是一种方法。是的,JodaTime支持是
转换器的完美用例,好吧!谢谢你详细的回答!这对我帮助很大!:)你好对不起,我不确定我是否理解正确。这是否意味着我应该创建我的数据库、反向工程/生成的jOOQ文件,然后将它们封装到更高级别的类包装器上?抱歉,如果这是一个愚蠢的问题:DStefan-是的,这正是我的意思。不一定是包装器,我会有不同的类。从经验来看,这需要做更多的工作,但是你避免了所有hibernate风格的肮脏行为,试图将你的域塞进一些不合适的类(基本的ORM问题)好吧,我明白了-谢谢你提供的信息。如果没有实际的经验,很难想象会发生这样的事情。您是否有可能知道一个项目(例如github上的项目)遵循您的方法,以便我可以查看其代码?或者你有一个非常小的例子,可以添加到你的答案中?我已经接受了卢卡斯的答案,但我不介意创建一个专门针对这个“包装”问题的新答案对于记录,可能值得一提的是,有一个
bookRecord.into(Class)
方法(和一个逆
bookRecord.from(value)
方法)可以按照命名约定映射值…@LukasEder,是的,如果您不介意反射的话,这很有用(我更喜欢“查找用法”和继续工作的东西,所以我更喜欢手动映射)
Book book = new Book();
book.setId(bookRecord.getId());
book.setFirstname(bookRecord.getFirstname());