2015-01-14 7 views
0

Я пытаюсь сохранить запись с отображенным полем @Persistent InputStream. Контекст: JDK 1.8, LiferayPortal на Tomee 1.7.1 (OpenJPA 2.4-patch). Извините за стек, загрязненный Liferay.Не удается сохранить запись с помощью Persistent InputStream в OpenJPA

@Entity 
@Table(name = "file_entries") 
public class FileEntry implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(length = 120) 
    private String createdBy; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date created; 

    @Column(length = 120) 
    private String modifiedBy; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date modified; 

    @Column(length = 200) 
    private String title; 

    @Column(length = 2000) 
    private String description; 

    @Column(length = 240) 
    private String filename; 

    @Column(length = 60) 
    private String extension; 

    @Column(length = 20) 
    private String version; 

    @Column(length = 240) 
    private String contentType; 

    @Persistent(fetch = FetchType.LAZY) 
    private InputStream content; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getCreatedBy() { 
     return createdBy; 
    } 

    public void setCreatedBy(String createdBy) { 
     this.createdBy = createdBy; 
    } 

    public Date getCreated() { 
     return created; 
    } 

    public void setCreated(Date created) { 
     this.created = created; 
    } 

    public String getModifiedBy() { 
     return modifiedBy; 
    } 

    public void setModifiedBy(String modifiedBy) { 
     this.modifiedBy = modifiedBy; 
    } 

    public Date getModified() { 
     return modified; 
    } 

    public void setModified(Date modified) { 
     this.modified = modified; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getFilename() { 
     return filename; 
    } 

    public void setFilename(String filename) { 
     this.filename = filename; 
    } 

    public String getExtension() { 
     return extension; 
    } 

    public void setExtension(String extension) { 
     this.extension = extension; 
    } 

    public String getVersion() { 
     return version; 
    } 

    public void setVersion(String version) { 
     this.version = version; 
    } 

    public InputStream getContent() { 
     return content; 
    } 

    public void setContent(InputStream content) { 
     this.content = content; 
    } 

    public String getContentType() { 
     return contentType; 
    } 

    public void setContentType(String contentType) { 
     this.contentType = contentType; 
    } 
} 

И когда сохраняющиеся:

logo = new FileEntry(); 
logo.setContent(new FileInputStream("some_local_file")); 
entityService.persist(logo); 

Я получаю следующее исключение.

<openjpa-2.4.0-nonfinal-1598334-r422266:1599166 fatal general error> org.apache.openjpa.persistence.PersistenceException: The transaction has been rolled back. See the nested exceptions for details on the errors that occurred. 
     at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2370) 
     at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2207) 
     at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2105) 
     at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1876) 
     at org.apache.openjpa.kernel.DelegatingBroker.flush(DelegatingBroker.java:1045) 
     at org.apache.openjpa.persistence.EntityManagerImpl.flush(EntityManagerImpl.java:663) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.zeroturnaround.jrebel.integration.openjpa.EntityManagerFactoryWrapper$ReloadingMethodHandler.invoke(EntityManagerFactoryWrapper.java:135) 
     at com.sun.proxy.$Proxy619.flush(Unknown Source) 
     at org.apache.openejb.persistence.JtaEntityManager.flush(JtaEntityManager.java:202) 
     at com.computas.generic.service.SimpleEntityService.persist(SimpleEntityService.java:37) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:192) 
     at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:173) 
     at org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:181) 
     at org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:100) 
     at sun.reflect.GeneratedMethodAccessor585.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:192) 
     at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:173) 
     at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:85) 
     at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:227) 
     at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:194) 
     at org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:308) 
     at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:303) 
     at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:92) 
     at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:308) 
     ... 171 more 
Caused by: <openjpa-2.4.0-nonfinal-1598334-r422266:1599166 fatal general error> org.apache.openjpa.persistence.PersistenceException: can't call setAutoCommit when the connection is JtaManaged 
     at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4998) 
     at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4958) 
     at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:134) 
     at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:108) 
     at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:60) 
     at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.populateRowManager(AbstractUpdateManager.java:185) 
     at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:96) 
     at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:77) 
     at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:732) 
     at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131) 
     ... 204 more 
Caused by: java.sql.SQLException: can't call setAutoCommit when the connection is JtaManaged 
     at org.apache.openejb.resource.jdbc.managed.local.ManagedConnection.forbiddenCall(ManagedConnection.java:185) 
     at org.apache.openejb.resource.jdbc.managed.local.ManagedConnection.invokeUnderTransaction(ManagedConnection.java:162) 
     at org.apache.openejb.resource.jdbc.managed.local.ManagedConnection.invoke(ManagedConnection.java:93) 
     at com.sun.proxy.$Proxy618.setAutoCommit(Unknown Source) 
     at org.apache.openjpa.lib.jdbc.DelegatingConnection.setAutoCommit(DelegatingConnection.java:167) 
     at org.apache.openjpa.lib.jdbc.DelegatingConnection.setAutoCommit(DelegatingConnection.java:167) 
     at org.apache.openjpa.lib.jdbc.ConfiguringConnectionDecorator$ConfiguringConnection.setAutoCommit(ConfiguringConnectionDecorator.java:117) 
     at org.apache.openjpa.lib.jdbc.DelegatingConnection.setAutoCommit(DelegatingConnection.java:167) 
     at org.apache.openjpa.lib.jdbc.DelegatingConnection.setAutoCommit(DelegatingConnection.java:167) 
     at org.apache.openjpa.jdbc.sql.PostgresDictionary.insertPostgresBlob(PostgresDictionary.java:627) 
     at org.apache.openjpa.jdbc.sql.PostgresDictionary.insertBlobForStreamingLoad(PostgresDictionary.java:614) 
     at org.apache.openjpa.jdbc.meta.strats.LobFieldStrategy.insert(LobFieldStrategy.java:100) 
     at org.apache.openjpa.jdbc.meta.FieldMapping.insert(FieldMapping.java:623) 
     at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.insert(AbstractUpdateManager.java:238) 
     at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.populateRowManager(AbstractUpdateManager.java:165) 
     ... 208 more 

Декларация единицы сохранения:

<persistence-unit name="uefiscdi" transaction-type="JTA"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <jta-data-source>uefiscdiDS</jta-data-source> 
    <properties> 
     <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" /> 
     <property name="openjpa.jdbc.DBDictionary" value="postgres" /> 
     <property name="openjpa.Log" value="DefaultLevel=INFO, Tool=INFO" /> 
    </properties> 
</persistence-unit> 

Декларация Datasource является:

<Resource id="uefiscdiDS" type="DataSource"> 
    JdbcDriver   org.postgresql.Driver 
    JdbcUrl    jdbc:postgresql://localhost:5432/db_name 
    UserName   user_name 
    Password   user_password 
    JtaManaged   true 
    DefaultAutoCommit false 
</Resource> 

Я попытался с DefaultAutoCommit истина/ложь/не объявлена ​​... тем же исключением.

+0

Можем ли мы также увидеть содержимое вашего persistence.xml? – Rick

+0

Обновлено оригинальное сообщение с persistence.xml, tomee.xml и дополнительная информация –

ответ

0

Просто выстрел в темноте, но вы попробовали позвонить em.persist(...), а не em.merge(..)?

Если это не сработает, может быть полезно, если вы где-нибудь разместите полную трассировку стека. Боюсь, вы, возможно, отрезали важные части.

+0

Я скорректировал stacktrace, чтобы показать соответствующую часть, полученную мной после переноса всех методов, связанных с сохранением, из моего ejb в вызовах «em.flush()», только в чтобы исключить проглатывание оригинального исключения OpenEjb. –

 Смежные вопросы

  • Нет связанных вопросов^_^