2014-07-26 5 views
0

Neo4j 지속성을 위해 Dog/Breed example from the docs 작업을하려고합니다. 데이터베이스는 정상적으로 생성되지만 데이터는 플러시 될 수 없습니다. 위의 DogBreedRunner.java 클래스에서 org.neo4j.graphdb.NotInTransactionExceptionem.flush() 명령어를 가져오고 있습니다.데이터 플러시 오류 org.neo4j.graphdb.NotInTransactionExcept

나는 인터넷 검색을 시도했지만 실제로 문제를 해결할 수 없었다. 여기에 내 프로젝트 (나는 문서에서 자바 클래스를 만지지 않았다)입니다.

누군가 도와 줄 수 있습니까? 다른 정보가 필요한지 알려주십시오.

의 persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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="ogm-jpa-tutorial" transaction-type="JTA"> 
     <!-- Use Hibernate OGM provider: configuration will be transparent --> 
     <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider> 
     <properties> 
      <property name="hibernate.ogm.datastore.provider" value="neo4j_embedded" /> 
      <property name="hibernate.ogm.neo4j.database_path" value="C:/Neo4j/NEO4J_HOME/data/graph.db" /> 

      <!-- defines which JTA Transaction we plan to use --> 
      <property name="hibernate.transaction.jta.platform" 
         value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

Dog.java

package org.hibernate.ogm.examples.gettingstarted.domain; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.ManyToOne; 
import javax.persistence.TableGenerator; 

@Entity 
public class Dog { 
    @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "dog") 
    @TableGenerator(
     name = "dog", 
     table = "sequences", 
     pkColumnName = "key", 
     pkColumnValue = "dog", 
     valueColumnName = "seed" 
    ) 
    public Long getId() { return id; } 
    public void setId(Long id) { this.id = id; } 
    private Long id; 

    public String getName() { return name; } 
    public void setName(String name) { this.name = name; } 
    private String name; 

    @ManyToOne 
    public Breed getBreed() { return breed; } 
    public void setBreed(Breed breed) { this.breed = breed; } 
    private Breed breed; 
} 

Bread.java

package org.hibernate.ogm.examples.gettingstarted.domain; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 

import org.hibernate.annotations.GenericGenerator; 

@Entity 
public class Breed { 

    @Id @GeneratedValue(generator = "uuid") 
    @GenericGenerator(name="uuid", strategy="uuid2") 
    public String getId() { return id; } 
    public void setId(String id) { this.id = id; } 
    private String id; 

    public String getName() { return name; } 
    public void setName(String name) { this.name = name; } 
    private String name; 
} 

DogBreedRunner.java

package org.hibernate.ogm.examples.gettingstarted; 

import org.hibernate.ogm.examples.gettingstarted.domain.Breed; 
import org.hibernate.ogm.examples.gettingstarted.domain.Dog; 
import org.hibernate.ogm.util.impl.Log; 
import org.hibernate.ogm.util.impl.LoggerFactory; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.transaction.TransactionManager; 
import java.lang.reflect.InvocationTargetException; 

public class DogBreedRunner { 

    private static final String JBOSS_TM_CLASS_NAME = "com.arjuna.ats.jta.TransactionManager"; 
    private static final Log logger = LoggerFactory.make(); 

    public static void main(String[] args) { 

     TransactionManager tm = getTransactionManager(); 

     //build the EntityManagerFactory as you would build in in Hibernate Core 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("ogm-jpa-tutorial"); 

     //Persist entities the way you are used to in plain JPA 
     try { 
      tm.begin(); 
      logger.infof("About to store dog and breed"); 
      EntityManager em = emf.createEntityManager(); 
      Breed collie = new Breed(); 
      collie.setName("Collie"); 
      em.persist(collie); 
      Dog dina = new Dog(); 
      dina.setName("Dina"); 
      dina.setBreed(collie); 
      em.persist(dina); 
      Long dinaId = dina.getId(); 
         logger.infof("About to commit"); 
      em.flush(); 
      em.close(); 
      tm.commit(); 

      //Retrieve your entities the way you are used to in plain JPA 
      logger.infof("About to retrieve dog and breed"); 
      tm.begin(); 
      em = emf.createEntityManager(); 
      dina = em.find(Dog.class, dinaId); 
      logger.infof("Found dog %s of breed %s", dina.getName(), dina.getBreed().getName()); 
      em.flush(); 
      em.close(); 
      tm.commit(); 

      emf.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    public static TransactionManager getTransactionManager() { 
     try { 
      Class<?> tmClass = DogBreedRunner.class.getClassLoader().loadClass(JBOSS_TM_CLASS_NAME); 
      return (TransactionManager) tmClass.getMethod("transactionManager").invoke(null); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 
,536,913 63,210

의 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>hibernate-ogm-documentation-examples</groupId> 
    <artifactId>HibernateOMG</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <description>Full code for the Getting Started Guide</description> 
    <url>http://ogm.hibernate.org</url> 

    <dependencies> 
     <!-- Hibernate OGM dependency --> 
     <dependency> 
      <groupId>org.hibernate.ogm</groupId> 
      <artifactId>hibernate-ogm-core</artifactId> 
      <version>4.1.0.Beta5</version> 
     </dependency> 

     <!-- standard APIs dependencies - provided in a Java EE container --> 
     <dependency> 
      <groupId>org.hibernate.javax.persistence</groupId> 
      <artifactId>hibernate-jpa-2.0-api</artifactId> 
      <version>1.0.1.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate.ogm</groupId> 
      <artifactId>hibernate-ogm-neo4j</artifactId> 
      <version>4.1.0.Beta5</version> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.spec.javax.transaction</groupId> 
      <artifactId>jboss-transaction-api_1.1_spec</artifactId> 
      <version>1.0.0.Final</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.eclipse.persistence</groupId> 
      <artifactId>javax.persistence</artifactId> 
      <version>2.1.0</version> 
      <type>jar</type> 
     </dependency>  

     <!-- JBoss Transactions dependency --> 
     <dependency> 
      <groupId>org.jboss.jbossts</groupId> 
      <artifactId>jbossjta</artifactId> 
      <version>4.16.4.Final</version> 
     </dependency> 


    </dependencies> 
</project> 

예외 :

org.neo4j.graphdb.NotInTransactionException org.neo4j.kernel.impl.persistence.PersistenceManager.getCurrentTransaction에서 (PersistenceManager.java:284) org.neo4j.kernel.impl.persistence.PersistenceManager.currentKernelTransactionForReading (PersistenceManager.java:230)에서 org.neo4j.kernel.impl.persistence.PersistenceManager.getResource (PersistenceManager.java:249) 에서,691,363 에서 org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.transaction org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.instance (ThreadToStatementContextBridge.java:47)에서 (ThreadToStatementContextBridge.java:53) 210 조직도 org.hibernate.ogm에서 .neo4j.kernel.impl.core.NodeProxy.setProperty org.hibernate.ogm.datastore.neo4j.Neo4jDialect.putTupleOperation (Neo4jDialect.java:373)에서 (NodeProxy.java:203) 에서 org.hibernate.ogm.datastore.neo4j.Neo4jDialect.applyTupleOperations (Neo4jDialect.java:348) 에서 .datastore.neo4j.Neo4jDialect.applyOperation (Neo4jDialect.java:355) 또는 g.hibernate.ogm.datastore.neo4j.Neo4jDialect.updateTuple org.hibernate.action에서 org.hibernate.ogm.persister.OgmEntityPersister.insert (OgmEntityPersister.java:928) 에서 (Neo4jDialect.java:123) . internal.EntityInsertAction.execute org.hibernate.engine.spi.ActionQueue.executeActions (ActionQueue.java:463) org.hibernate.engine.spi.ActionQueue.executeActions에서 에서 (EntityInsertAction.java:104) (ActionQueue. java : 349) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions (AbstractFlushingEventListener.java:350) at org.hibernate.event.internal. org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush (AbstractEntityManagerImpl.java:1335)에서 org.hibernate.internal.SessionImpl.flush (SessionImpl.java:1222) 에서 DefaultFlushEventListener.onFlush (DefaultFlushEventListener.java:56) org.hibernate.ogm.examples.gettingstarted.DogBreedRunner.main (DogBreedRunner.java:40)에서 org.hibernate.ogm.jpa.impl.OgmEntityManager.flush (OgmEntityManager.java:119) 에서

답변

1

나는 공식 포럼에 질문을 올렸고 나는 맞는 대답을 얻었다.

  • 은 당신의 persistence.xml에서 "hibernate.transaction.jta.platform"속성을 제거합니다. 그 이유는 Neo4j atm을 위해 특수 구현이 필요하기 때문입니다. (희망 사항은 미래에 변경되어야 함). 그러나 Hibernate OGM은 JBossStandAloneJtaPlatform을 Neo4j를 제외한 모든 저장소에 기본값 으로 사용하므로 지정할 필요가 없습니다.
  • 합니다 (EMF가 부트 스트랩 된 후에는 일을해야) 트랜잭션 관리자를 검색하기 위해 다음과 같은 방법을 사용 :
private static TransactionManager extractJBossTransactionManager(EntityManagerFactory factory) { 
    SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) ((HibernateEntityManagerFactory) factory).getSessionFactory(); 
    return sessionFactory.getServiceRegistry().getService(JtaPlatform.class).retrieveTransactionManager(); 
} 

당신이 해야하는 BTW. 동일한 엔티티 관리자를 사용하여 여러 트랜잭션을 연속적으로 작업하는 경우 트랜잭션이 시작된 후 EntityManager # joinTransaction() 을 호출해야합니다.

출처 : https://forum.hibernate.org/viewtopic.php?f=31&t=1035764&p=2480105