Java 应用程序级数据库约束转发:如何自动使用JDBC和Spring

Java 应用程序级数据库约束转发:如何自动使用JDBC和Spring,java,jdbc,spring-data,spring-jdbc,spring-validator,Java,Jdbc,Spring Data,Spring Jdbc,Spring Validator,我希望能够从本质上反思所有实体都绑定到的模式的细节,并将其向前拉到应用程序层进行验证,这样我就不会向最终将被拒绝的数据库提交数据(从而浪费资源) 例如: CREATE TABLE Foo( ID BIGINT PRIMARY KEY, Baz varchar(5) NOT NULL ); @Entity public class Foo { @Id public Long id; public String baz; } @Repository pub

我希望能够从本质上反思所有实体都绑定到的模式的细节,并将其向前拉到应用程序层进行验证,这样我就不会向最终将被拒绝的数据库提交数据(从而浪费资源)

例如:

CREATE TABLE Foo(
    ID BIGINT PRIMARY KEY,
    Baz varchar(5) NOT NULL
);

@Entity
public class Foo {
   @Id
   public Long id;

   public String baz;

}


@Repository
public interface FooRepository extends PagingAndSortingRepository<Foo, Long> {}

Foo f = new Foo();
f.id = 1;
f.baz = "123456";

@Autowired 
FooRespository fooRepo;
fooRepo.save(f); // fails BEFORE going to DB with constrain violation.
创建表Foo(
ID BIGINT主键,
Baz varchar(5)不为空
);
@实体
公开课Foo{
@身份证
公共长id;
公共字符串baz;
}
@存储库
公共接口FooRepository扩展了分页和排序存储库{}
Foo f=新的Foo();
f、 id=1;
f、 baz=“123456”;
@自动连线
Fooreposition fooRepo;
fooRepo.save(f);//在转到约束冲突的DB之前失败。

我可以清楚地看到我可以自己实现这一点,但我假设在这个伟大的世界中有一个bean/验证器可以为我完成这项工作

我会避免重复您的模式制定的规则的设计。每次程序开始验证是否知道约束时,都必须对数据库进行有效的反向工程。此外,如果您有一个集群或分布式系统,另一个程序可能会插入一行,从而导致约束冲突,并且您的程序仍然需要处理该错误

我鼓励你要么(a)不要担心不应该经常发生的事情,要么(b)如果你打算经常故意破坏模式,就重新考虑你的设计


话虽如此,javax.validation.constraints包仍然存在,它可以帮助您预先验证对象是否看起来不错。但是您将在javax.validation.constraints的@NotNull注释和数据库模式之间重复工作。将业务规则放在一个地方,以尽量减少您需要进行的维护。

我已经使用javax.validation。如果我将它们放在DB(一个位置)中,那么我只是转发(而不是复制)规则。复制将在实体字段上具有@NotNull,而在列上具有NotNull。如果数据库中的约束被删除,应用程序可能会受到不适当的限制。