2015-01-14 5 views
0

매핑 된 @Peristent InputStream 필드가있는 레코드를 유지하려고합니다. 컨텍스트 : JDK 1.8, LiferayPortal on Tomee 1.7.1 (OpenJPA 2.4 패치). Liferay에 의해 오염 된 stacktrace에 대해 죄송합니다.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> 

데이터 소스의 선언은 다음과 같습니다

<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.merge(..)이 아닌 em.persist(...)으로 전화를 시도 했습니까?

전체 스택 추적을 어딘가에 게시 한 경우 유용하지 않을 수 있습니다. 중요한 부분을 잘랐을 수도 있습니다.

+0

"em.flush()"호출에서 내 ejb에서 모든 지속성 관련 메서드를 래핑 한 후 얻은 관련 부분을 표시하도록 stacktrace를 수정했습니다. 원래의 예외가 OpenEjb에 의해 삼켜지는 것을 피하기 위해서. –