我知道有一个类似的问题(@Size annotation not recognized (JPA)),但我认为给定的解决方案并不能解释这个问题。
我不想复制注释@Column(length)(对于JPA范围)和@Size(max)(对于Bean验证范围)。所以我尝试在两种情况下都只使用@Size注释。
我有一个简单的实体,其字段具有@Size(max = 50)注释,我还使用lombok实用程序(https://projectlombok.org)来简化setter和getter。
@Entity
@Table(name = "myentity", schema = "util")
@NoArgsConstructor()
public class MyEntity implements Serializable {
@Getter @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Short id;
/** attribute that contains the description, unique value*/
@Size(max = 50) @NotNull () @Column(unique = true) @Getter @Setter
private String description;
}
我有一个简单的类来引导Hibernate并创建模式。它包含@Named和@SessionScoped注释。它还包含一个主要方法。这样它既可以作为Java应用程序执行,也可以作为JSF中的托管bean执行。这是代码
@Named
@SessionScoped
@NoArgsConstructor
public class HibernateBootstrap implements Serializable{
public String updateSchema() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("control_post");
emf.close();
return "OK";
}
public static void main(String[] args) {
new HibernateBootstrap().updateSchema();
}
}
包含一个简单的xhtml文件来调用updateSchema方法
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<h:form>
<p:commandButton value="Create Tables" action="#{hibernateBootstrap.updateSchema}"/>
</h:form>
</h:body>
</html>
当我将HibernateBootstrap.main方法作为Java应用程序执行时,我在控制台中得到了这个DDL句子
create table util.myentity (id serial not null, description varchar(255), primary key (id))
但是当我执行xhtml文件到Run on Server并按下“Create Tables”按钮时,会生成这个DDL语句(考虑到@Size(max)注释:
create table util.myentity (id serial not null, description varchar(50) not null, primary key (id))
如果要查看persistence.xml,请输入以下代码。感谢
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="control_post" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/mydb" />
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.username" value="user" />
<property name="hibernate.connection.password" value="password" />
</properties>
</persistence-unit>
</persistence>