Автоматическое создание таблицы базы данных с помощью java play 2 framework и spring data jpa

В настоящее время я работаю над проектом веб-приложения, используя фреймворк java Play 2.3.2 и данные Spring jpa с использованием базы данных postgresql. Я установил образец игры из активатора под названием play-spring-data-jpa, и его можно найти здесь: 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

Когда я создаю таблицу самостоятельно, все идет нормально. Я не хочу воссоздавать таблицу каждый раз, когда я ее удаляю.

Обновление: удаление Generated решило проблему. Однако идентификатор должен быть вставлен вручную! Как я могу автоматически сгенерировать идентификатор?

2-е обновление: проблема была решена с помощью этого ссылка на stackoverflow


person Salman Ahmed    schedule 14.08.2014    source источник


Ответы (2)


Это создает проблему, поскольку вы используете generated by default as identity

убери и будет нормально

Попробуйте следующий запрос

CREATE TABLE attendance.Person (id BIGINT , firstname VARCHAR(255), surname VARCHAR(255), PRIMARY KEY (id))
person prashant thakre    schedule 14.08.2014
comment
Вы правы, по какой-то причине аннотация Genrated вызывает ошибку. Я не уверен, почему, но может ли это быть сам БД? Или водитель? Мне нужно найти другой способ реализовать эту функцию! У Вас есть какие-то предложения? - person Salman Ahmed; 15.08.2014
comment
почему вы хотите использовать Genrated annotation даже без его использования, он будет работать нормально. - person prashant thakre; 15.08.2014

Мы также столкнулись с той же проблемой. У нас было создание в xml и @GeneratedValue в столбце идентификатора. Решение заключается в удалении аннотации @GeneratedValue и указании значения идентификатора вручную, также по умолчанию jpa занимает много времени, поэтому дайте длинное значение, например, 1l.

Чтобы выполнить автогенерацию, следуйте другому правилу.

Проблема с автоматически сгенерированным идентификатором, связанным с JPA, решена, как показано ниже:

Измените класс модели Person.java, чтобы он содержал следующие аннотации для атрибута Id:

@Id @TableGenerator(name="TABLE_GEN",table="T_GENERATOR",pkColumnName="GEN_KEY",pkColumnValue="TEST",valueColumnName="GEN_VALUE",initialValue=1,allocationSize=1) @GeneratedValue(strategy=GenerationType. TABLE, генератор = "TABLE_GEN") общедоступный длинный идентификатор;

Это создаст таблицу в схеме mysql с именем T_GNERATOR, которая будет отслеживать следующее значение для Id, а JPA через спящий режим знает, как получить это значение. Предполагается, что начальное значение идентификатора равно 1 и увеличивается на 1 при каждой новой вставке в него, что очевидно из атрибутов аннотации.

person Avinav Mishra    schedule 25.01.2015