11

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>

何が欠けているのか誰にも分かりますか?

4

9 に答える 9

9

特定の例外が発生していますか? それが何であるかを知っていると便利です。

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

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

Spring、Hibernate、および JPA: entitymanager で永続化を呼び出しても、データベースにコミットしていないようです

em.flush()これらは、の後に追加して、注釈em.persist(chain)を変更することをお勧めします@transactional

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

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

.xml 構成で

于 2012-12-07T09:16:38.707 に答える
7

これを試して:

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

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

于 2012-12-07T14:50:23.070 に答える
1

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

このタグで指定できます

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

あるいは単に

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

これをプロバイダータグの上に置きます。

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

値が設定された Id カラムでメソッド save() を使用すると、hibernate はデータをUPDATEではなくINSERT しようとします。

実行: getEntityManager メソッドの作成

public EntityManager getEntityManager() {
    return entityManager;
}

それで

@Transactional
public void saveChain(Chain chain) {

    chain.setDate(new Date());
    getEntityManager().persist(chain);
}
于 2012-12-07T09:10:41.393 に答える
0

これらを追加すると、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>
于 2015-03-06T08:09:36.377 に答える
-1

以下のように ID 生成戦略を割り当てる必要があります。

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

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

そして保存方法で

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

        return 222;
    }

Id を割り当てると、hibernate/jpa は新しいレコードを挿入する代わりに、利用できないレコードを更新しようとし、例外はスローされないと思います。

于 2012-12-07T09:09:51.723 に答える