@Size注释,Hibernate JPA在Java应用程序和Web托管bean执行环境中创建不同的DDL

时间:2017-12-03 09:29:33

标签: hibernate jpa size ddl

我知道有一个类似的问题(@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>

0 个答案:

没有答案