代码之家  ›  专栏  ›  技术社区  ›  Salman Ahmed

使用javaplay2框架和springdatajpa自动生成数据库表

  •  1
  • Salman Ahmed  · 技术社区  · 10 年前

    我目前正在使用javaPlay2.3.2框架和使用postgresql数据库的springdatajpa开发一个web应用程序项目。我已经从activator安装了名为play-spring-data jpa的play示例,可以在这里找到: play-spring-data-jpa
    我面临的问题是自动生成表格,由于某种原因,此功能无法正常工作,显示以下错误:

    [error] o.h.t.h.SchemaUpdate - Unsuccessful: create table public.Person (id bigint generated by default as identity, firstname varchar(255), surname varchar(255), primary key (id))
    [error] o.h.t.h.SchemaUpdate - ERROR: syntax error at or near "generated"
    Position: 39
    [info] play - Application started (Dev)
    [error] o.h.u.JDBCExceptionReporter - ERROR: relation "public.person" does not exist
    Position: 13
    [error] play - Cannot invoke the action, eventually got an error:  javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not insert:[models.Person]
    [error] application - 
    

    我的persistence.xml:

    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    
    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>DefaultDS</non-jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
    

    我的应用程序.conf:

    db.default.driver=org.postgresql.Driver
    db.default.url="jdbc:postgresql://localhost:5432/MyTest"
    db.default.user=postgres
    db.default.password="2580"
    db.default.jndiName=DefaultDS
    applyEvolutions.default=true
    

    当我创建表格时,一切都正常。每次删除表时,我都不想自己重新创建它。

    更新: 删除生成的已解决问题。但是,id必须手动插入!如何自动生成id?

    第二次更新: 借助这个解决了问题 stackoverflow link

    2 回复  |  直到 4 年前
        1
  •  1
  •   prashant thakre    10 年前

    使用时会产生问题 generated by default as identity

    去掉它,它会很好的

    尝试以下查询

    CREATE TABLE attendance.Person (id BIGINT , firstname VARCHAR(255), surname VARCHAR(255), PRIMARY KEY (id))
    
        2
  •  0
  •   Avinav Mishra    10 年前

    我们也面临同样的问题。我们在xml中创建了id列上的@GeneratedValue。解决方案是删除@GeneratedValue注释,并手动输入id的值,默认情况下jpa需要很长的时间,因此给出长值,例如1l。

    要进行自动生成,请遵循另一条规则。

    围绕JPA相关自动生成Id的问题解决如下:

    修改Person.java模型类,使Id属性具有以下注释:

    @身份证号 @TableGenerator(name=“TABLE_GEN”,TABLE=“T_GENERATOR”,pkColumnName=“GEN_KEY”,pkColumnValue=“TEST”,valueColumnName=”GEN_VALUE“,initialValue=1,allocationSize=1) @GeneratedValue(策略=GenerationType.TABLE,生成器=“TABLE_GEN”) 公共长Id;

    这将在mysql模式中创建一个名为T_GNERATOR的表,该表将跟踪Id的下一个值,而JPA over hibernate知道如何检索该值。假设Id的初始值为1,并且在每次新插入时递增1,这从注释的属性中显而易见。