简介:我正在使用Hibernate Tools 4.0.0-CR1和Hibernate 4.2(包括Hibernate Validator),但是没有使用Bean验证。该模式 是 与部署时正确生成hibernate.hbm2ddl.auto=create- drop。
hibernate.hbm2ddl.auto=create- drop
但是我更喜欢通过以下build.xml目标生成我的DDL:
<target name="schemaexport" depends="jar" description="Exports a generated schema to DB and files"> <path id="lib.path"> <fileset refid="lib" /> <pathelement location="${jboss.home}/modules/org/apache/xerces/main/xercesImpl-2.9.1-jbossas-1.jar"/> <pathelement location="${jar.dir}" /> </path> <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="lib.path"/> <hibernatetool destdir="${basedir}"> <classpath refid="lib.path"/> <jpaconfiguration persistenceunit="TIC" propertyfile="hibernate-console.properties" /> <hbm2ddl outputfilename="${dist.dir}/db_ddl.sql" format="true"/> </hibernatetool> <concat destfile="${dist.dir}/tic.sql" fixlastline="yes"> <filelist dir="${dist.dir}" files="db_ddl.sql" /> <filelist dir="${jar.dir}" files="import.sql" /> </concat> </target>
我的hibernate-console.properties如下:
hibernate.connection.password=tic hibernate.connection.username=tic hibernate.connection.driver_class=org.postgresql.Driver hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect hibernate.connection.url=jdbc:postgresql://127.0.0.1:5432/db hibernate.connection.provider_class=org.hibernate.connection.DriverManagerConnectionProvider hibernate.datasource= hibernate.transaction.manager_lookup_class=
我仔细检查了jar在我的lib.path中…
示例实体如下所示:
@Entity public class Title implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Size(max = 50) @NotEmpty @Column(length = 50) private String titlename; @Size(max = 50) private String shortTitle; }
这里的问题是hbm2ddl为“ titlename”生成了正确的“ varchar(50)”,而为“ shortTitle”生成了通用的“ varchar(255)”。我在@NotNull和基本上其他所有bean验证批注中都遇到了类似的问题。根据手册,这应该可以正常工作[tm]。我究竟做错了什么?
您需要区分验证API和Java持久性API(jpa)(以及供应商特定的持久性api)。Hibernate考虑了JPA配置(和hibernate持久性api),并且当您不提供此类配置时Convention Over Configuration,该过程就涉及到原理。这就是为什么你varchar(255)的
Convention Over Configuration
varchar(255)
@Size(max = 50) private String shortTitle;
等于(我省略了其他默认值)
@Size(max = 50) @Column(length = 255, nullable = true) private String shortTitle;
验证API涉及验证目的。检查字段是否正确填充。同一字段可能存在不同的验证规则。
更新
我的意思是这个http://beanvalidation.org/1.0/spec/#constraintsdefinitionimplementation- constraintdefinition- groups。
对于一组,您验证一个约束,对于另一组,您验证另一个约束。
例如
@NotNull(groups = DefaultGroup.class) @Null(groups = SecondGroup.class) private String shortTitle;
然后
Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<Title>> constraintViolations = validator.validate(title, DefaultGroup.class); Set<ConstraintViolation<Title>> secondConstraintViolations = validator.validate(title, SecondGroup.class);