"Исключение в теме" главная "org.apache.openjpa.persistence.RollbackException: рядом с ошибкой "FOR" - PullRequest
1 голос
/ 19 августа 2011

Я сталкиваюсь с этой ошибкой в ​​JPA с использованием SQLite, и я не знаю, почему она это делает, помогите?

My 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_1_0.xsd"
version="1.0">
<persistence-unit name="geronimo" transaction-type="RESOURCE_LOCAL">
    <provider>
        org.apache.openjpa.persistence.PersistenceProviderImpl
    </provider>
    <class>label.entities.Discography</class>
    <properties>
        <property name="openjpa.ConnectionURL" value="jdbc:sqlite:C:\\sqlitedb\\repo.db" />
        <property name="openjpa.ConnectionDriverName" value="org.sqlite.JDBC" />
        <property name="openjpa.ConnectionUserName" value="root" />
        <property name="openjpa.ConnectionPassword" value="" />
        <property name="openjpa.Log" value="SQL=TRACE" />
    </properties>
</persistence-unit>

Мой класс JPA:

package label.implementations;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import label.entities.Discography;



public class Disconfigurator {
public static void main(String[] args) {
    String persistenceUnit = "geronimo";
    EntityManagerFactory eFactory = Persistence.createEntityManagerFactory(persistenceUnit);
    EntityManager eManager = eFactory.createEntityManager();
    EntityTransaction eTransaction = eManager.getTransaction();
    eTransaction.begin();
    Discography discography = new Discography();
    discography.setArtist("Kings Of Leon");
    discography.setSong("Radioactive");
    eManager.persist(discography);
    eTransaction.commit();
    eManager.close();
    eFactory.close();

}
}

Мой класс сущностей:

package label.entities;

import javax.persistence.Column;
import javax.persistence.Entity;

@Entity(name="discography")
public class Discography {

@Column(name="artist",length=1000,nullable=true)
String artist;
@Column(name="song",length=1000,nullable=true)
String song;

public String getArtist() {
    return artist;
}

public void setArtist(String artist) {
    this.artist = artist;
}

public String getSong() {
    return song;
}

public void setSong(String song) {
    this.song = song;
}

}

Трассировка ошибки:

    47  geronimo  INFO   [main] openjpa.Runtime - Starting OpenJPA 1.2.1
2500  geronimo  WARN   [main] openjpa.jdbc.JDBC - Your database configuration was not                             recognized as a supported OpenJPA database. The generic dictionary will be used, which may         result in limited functionality. This behavior can be overridden by specifying the     appropriate dictionary class in the "openjpa.jdbc.DBDictionary" property of the OpenJPA     configuration.
2500  geronimo  INFO   [main] openjpa.jdbc.JDBC - Using dictionary class     "org.apache.openjpa.jdbc.sql.DBDictionary" (SQLite 3.6.3 ,SQLiteJDBC native).
2500  geronimo  WARN   [main] openjpa.jdbc.JDBC - This database dictionary "class org.apache.openjpa.jdbc.sql.DBDictionary" is not officially supported by OpenJPA.
3406  geronimo  INFO   [main] openjpa.Enhance - Creating subclass for "[class label.entities.Discography]". This means that your application will be less efficient and will consume more memory than it would if you ran the OpenJPA enhancer. Additionally, lazy loading will not be available for one-to-one and many-to-one persistent attributes in types using field access; they will be loaded eagerly instead.
Exception in thread "main" <openjpa-1.2.1-r752877:753278 fatal store error> org.apache.openjpa.persistence.RollbackException: near "FOR": syntax error {SELECT SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE} [code=0, state=null]
at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:523)
at label.implementations.Disconfigurator.main(Disconfigurator.java:23)
Caused by: <openjpa-1.2.1-r752877:753278 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: near "FOR": syntax error {SELECT SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE} [code=0, state=null]
at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4232)
at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4197)
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:102)
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:88)
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:64)
at org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:65)
at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:752)
at org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:134)
at org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:520)
at org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2824)
at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:39)
at org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:960)
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1948)
at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1908)
at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1826)
at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1350)
at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:877)
at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:512)
... 1 more
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: near "FOR": syntax error {SELECT SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE} [code=0, state=null]
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:201)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$000(LoggingConnectionDecorator.java:57)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection.prepareStatement(LoggingConnectionDecorator.java:228)
at org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:164)
at org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.prepareStatement(ConfiguringConnectionDecorator.java:140)
at org.apache.openjpa.lib.jdbc.DelegatingConnection.prepareStatement(DelegatingConnection.java:153)
at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:511)
at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:471)
at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:481)
at org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:460)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.prepareStatement(TableJDBCSeq.java:756)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.getSequence(TableJDBCSeq.java:511)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.setSequence(TableJDBCSeq.java:554)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq$AllocateSequenceRunnable.run(TableJDBCSeq.java:824)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:424)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:290)
at org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
... 14 more

1 Ответ

0 голосов
/ 20 августа 2011

OpenJPA не поддерживает SQLite и генерирует неправильный SQL.

Это предложение FOR UPDATE, которое вызывает проблему, которую вы видите. Вы можете обойти это, установив свойство конфигурации DBJictionary в OpenJPA:

        <property name="openjpa.jdbc.DBDictionary" value="(forUpdateClause=)" />

Это позволит вам преодолеть только непосредственное исключение, и могут быть другие свойства, которые вам нужно установить. Если вы обнаружите, что вам нужно сделать много таких изменений, вы, возможно, захотите написать свой собственный DBDictionary for SQLite .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...