web-dev-qa-db-ja.com

EntityManagerのpersist()メソッドがデータベースにレコードを挿入しない

EntityManager.persist(Object)メソッドの使用に問題があります。今私が他の問題を取り除くとき、例外なしのアプリの仕事によって、オブジェクトは私のデータベースに入れられません。

私のエンティティクラス:

@Entity
@Table(name ="Chain")
public class Chain implements Serializable{

@Id
@Column(name = "id")
  private Long id;
@Column(name = "date")
  private Date date;
@Column(name = "name")
  private String name;
//setters and getters
}

私のdaoクラス:

@Transactional
@Repository("ChainDao")
public class ChainDaoImpl implements ChainDao{


    private EntityManager em;


    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this. em = em;
    }

    public int saveChain(Chain chain) {
        chain.setDate(new Date());
        chain.setId((long)44);
        Boolean a;
        em.persist(chain);

        return 222;
    }
}

私のxmlコンテキスト:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
    <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"></property></bean>


    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <bean class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory"
            ref="entityManagerFactory" />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean> 

およびpereistence.xml

<persistence xmlns="http://Java.Sun.com/xml/ns/persistence" version="1.0">
       <persistence-unit name="sample">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <!-- Scan for annotated classes and Hibernate mapping XML files -->
        <properties>
           <property name="hibernate.archive.autodetection" value="class, hbm"/>
           <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
           <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/database"/>
           <property name="hibernate.connection.username" value="postgres"/>
           <property name="hibernate.connection.password" value="pwd"/>
           <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
           <property name="hibernate.show_sql" value="true"/>
        </properties>
        </persistence-unit>

    </persistence>

私は何が欠けているのか誰かが知っていますか?

10
Grzzzzzzzzzzzzz

特定の例外が発生していますか?あなたがそうであるならば、それが何であるかを知ることは役に立ちます。

Stackoverflowにはすでにこれと同様の問題がいくつかあります。

Springトランザクションコンテキストはデータを保持しません

Spring、Hibernate、JPA:entitymanagerでpersistを呼び出すと、データベースにコミットされないようです

これらは、em.flush()の後にem.persist(chain)を追加して、@transactionalアノテーション

また、次のような行を通じてトランザクション注釈が有効になっていることを確認する必要があります。

<tx:annotation-driven transaction-manager="transactionManager"/> 

.xml構成

9
RoryB

これを試して:

em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();

PS:IDの生成方法も設定する必要があります。

7
Peter Adrian

どのような例外が発生していますか?あなたのエラーは、あなたの「チェーン」オブジェクトを指定していないpersistence.xmlであると私は思います。

このタグを使用して指定できます

<exclude-unlisted-classes>false</exclude-unlisted-classes>

あるいは単に

 <class>your.package.Chain</class>

これをproviderタグの上に置きます。

また、@ Idとしてタグ付けされた列には番号を設定しないでください

値が設定されたId列でメソッドsave()を使用すると、Hibernateは[〜#〜] update [〜#〜]データを挿入しようとしません。

これを行う:getEntityManagerメソッドを作成する

public EntityManager getEntityManager() {
    return entityManager;
}

その後

@Transactional
public void saveChain(Chain chain) {

    chain.setDate(new Date());
    getEntityManager().persist(chain);
}
1
Bernardo Vale

AppConfig構成ファイルのヘッダーで@EnableTransactionManagementを使用する

0
Randy Orton

これらをweb.xmlに追加すると、この問題が解決する場合があります。

<!-- Open Entity Manager in View filter -->
<filter>
    <filter-name>openEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>openEntityManagerInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
0
ElvisKang

新しいトランザクションを開いて、レコードをコミットできます。

@PersistenceUnit(unitName = "NameOfPersistenceUnit")
private EntityManagerFactory entityManagerFactory;

void someMethod(AccountCommodity accountCommodity){
     EntityManager entityManager = entityManagerFactory.createEntityManager();
     entityManager.getTransaction().begin();
     entityManager.persist(accountCommodity);
     entityManager.flush();
     entityManager.getTransaction().commit();
     entityManager.close();
}

を使用して私の問題を解決しました

org.springframework.transaction.jta.JtaTransactionManager

この作品を願っています!

0