0

JPA を使用して単純な Java Web (Vaadin) アプリケーション プロジェクトを作成しました。これは、データベースからエンティティを読み取るために機能します。persist() または merge() を使用しようとすると、データベースで何も起こりません。ログを見ると、SELECT クエリがありますが、INSERT / UPDATE はありません。

JDBC リソースが定義された Glassfish 3.1、persistence.xml を使用してそのリソース (JTA) を使用しています。Eclipse によって自動的に生成されたデフォルトの構成ファイルを使用しています。

他の誰かが行った別の同様のプロジェクトもあり、同じ JTA を使用しており、この問題は発生しません。その構成に目を通し、重要なものは何も見つかりませんでした。

どちらのプロジェクトもトランザクションを使用しません。

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
<persistence-unit name="MapperPersistence">
    <jta-data-source>mapper</jta-data-source>
         <class>pl.bdk.mapper.domain.jpaImpl.MappingImpl</class>
...
         <class>pl.bdk.mapper.domain.jpaImpl.UserImpl</class>
             <properties>
                 <property name="eclipselink.logging.level" value="FINE" />
             </properties>
    </persistence-unit>
</persistence>

Java コード

public class MappingService {
    public static int createMapping(String clientProductId, User user) {
        MappingImpl mapping = new MappingImpl();
        mapping.setUser(user);
        mappingDao.save(mapping);
        return mapping.getMappingId();
    }
}

...
public class MappingDao {
    public void save(MappingImpl mapping) {
        entityManager.persist(mapping);
    }
}

...
@Entity
@Table("t_mapping")
public class MappingImpl() {
    @Id
    @SequenceGenerator(name="T_MAPPING_MAPPINGID_GENERATOR", sequenceName="S_MAPPING_ID", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="T_MAPPING_MAPPINGID_GENERATOR")
    private Integer id;

    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;

... getters and setters...
}
4

1 に答える 1

0

OK、問題は単純に見えましたが、そうではありません。

この投稿は私を大いに助けてくれました: Hibernate does not save and doesn't throw exceptions?

まず第一に、JPA にはある種のトランザクションメカニズムが必要です。通常は下で管理されており、設定は必要ありません。つまり、最も簡単な方法は、EntityManager に @PersistenceContext を注入する EJB (Enterprise Java Bean) プロジェクトを作成することです。EntityManager をローカルで (EJB ではなく) 作成する場合でも、トランザクション メカニズムを提供する必要があります。詳しくは上の投稿で。

于 2011-10-20T13:39:33.950 に答える