简介:我正在使用Hibernate Tools 4.0.0-CR1和Hibernate 4.2(包括Hibernate Validator),但是没有选择Bean Validations.使用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.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验证注释中遇到了类似的问题.根据the manual,这应该工作[tm].我究竟做错了什么?
最佳答案 您需要区分验证api和java持久性api(jpa)(以及供应商特定的持久性api). Hibernate考虑了JPA配置(和hibernate持久性api),当您不提供此类配置时,此过程涉及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);