实体不会持久化

时间:2015-08-01 22:04:35

标签: spring hibernate jpa

我正在我的应用程序中实现JPA。 此应用程序已使用Spring,Hibernate SessionFactories(3),带有XA数据源的Wild Fly服务器和JTA事务管理器。

为了测试JPA,我将它设置在一个简单的Entity上,该Entity没有与任何其他Entity链接。

选择和HQL查询没问题,但没有保存。 我的问题是当我创建或更新这个实体时,创建和修改都没有效果且没有错误。

我想知道TransactionManager方面是否存在问题。 我拥有 persistence.xml 文件

服务:

@Service
@Transactional(value = "transactionManager")
public class UtilisateurServiceImpl implements UtilisateurService {

       @Autowired
       private UtilisateurDao utilisateurDAO;

       public UtilisateurServiceImpl() {
       }
...

public void creerUser() {
           utilisateurDAO.creerUser();
       }

}

道:

@Repository
public class UtilisateurDaoImpl implements UtilisateurDao {

       @PersistenceContext(unitName="habilitationPersistenceUnit") private EntityManager entityManager;     

       public UtilisateurDaoImpl() {

       }
...

       public void creerUser() {
           UtilisateurEntity utilisateur2 = new UtilisateurEntity();
        utilisateur2.setDateCreation(new Date());
        utilisateur2.setFax("");
        utilisateur2.setIdentifiant("Olivier");
        utilisateur2.setPassword("password");
        utilisateur2.setMail("");
        utilisateur2.setNom("Potonnier");
        utilisateur2.setNomAffichage("Olivier Potonnier");
        utilisateur2.setPrenom("Olivier");
        utilisateur2.setTelephone("");
        utilisateur2.setDateMAJ(new Date());
        //utilisateur2.setPk(40);
        try {
        entityManager.persist(utilisateur2);
        entityManager.flush();
        } catch(Exception e) {
            e.printStackTrace();
        }

//        try {
//         UtilisateurEntity entity = entityManager.find(UtilisateurEntity.class, 1);
//         entity.setPassword("password");
//         entityManager.merge(entity);
//        } catch(Exception e) {
//            e.printStackTrace();
//        }

       }

实体:

@Entity @Table(name="UTILISATEUR")
public class UtilisateurEntity implements Serializable {
    private static final long serialVersionUID = -3416450676331189345L;

    @Id @GenericGenerator(name="entityIdGenerator", strategy="com.prima.solutions.primaclaims.core.dao.impl.PkGenerator", 
                          parameters={@Parameter(name=PkGenerator.TABLE, value="SEQUENCE"),
                                      @Parameter(name=PkGenerator.PK_COLUMN_NAME, value="ENTITE"),
                                      @Parameter(name=PkGenerator.PK_COLUMN_VALUE, value="UTILISATEUR"),
                                      @Parameter(name=PkGenerator.VALUE_COLUMN_NAME, value="NUMERO")
                          })
    @GeneratedValue(generator="entityIdGenerator")
    private Integer pk;

        @Column(name="NOM") private String nom;
        @Column(name="PRENOM") private String prenom;
        @Column(name="IDENTIFIANT") private String identifiant;
        @Column(name="PASSWORD") private String password;
        @Column(name="NOM_AFFICHAGE") private String nomAffichage;
        @Column(name="TELEPHONE") private String telephone;
        @Column(name="FAX") private String fax;
        @Column(name="MAIL") private String mail;
        @Column(name="DATE_CREATION") private Date dateCreation;

        @Column(name="DATE_MISE_A_JOUR") private Date dateMAJ;


        public Integer getPk() {
            return pk;
        }
        public void setPk(Integer pk) {
            this.pk = pk;
        }
    ....
    }

数据源配置

<!-- Data sources des differents schema -->
    <bean id="dataSourceReferentiel" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
        <property name="jndiName" value="java:/DS_Referentiel" />
        <property name="resourceRef" value="true" />
    </bean>

    <bean id="dataSourceHabilitation" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
        <property name="jndiName" value="java:/DS_Habilitation" />
        <property name="resourceRef" value="true" />
    </bean>

    <bean id="dataSourceSinistre" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
        <property name="jndiName" value="java:/DS_Sinistre" />
        <property name="resourceRef" value="true" />
    </bean>

    <!-- Transaction manager -->
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />

实体经理配置

<bean id="referentielEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="referentielPersistenceUnit" />      
        <property name="dataSource" ref="dataSourceReferentiel" />
        <property name="packagesToScan" value="com...entity.referentiel" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!-- Privilégier les logs debug de org.hibernate.SQL -->
                <property name="showSql" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
            </bean>
        </property>
    </bean>

    <bean id="habilitationEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="habilitationPersistenceUnit" />      
        <property name="dataSource" ref="dataSourceHabilitation" />
        <property name="packagesToScan" value="com...entity.habilitation" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!-- Privilégier les logs debug de org.hibernate.SQL -->
                <property name="showSql" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
            </bean>
        </property>
    </bean>

    <bean id="sinistreEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="sinistrePersistenceUnit" />      
        <property name="dataSource" ref="dataSourceSinistre" />
        <property name="packagesToScan" value="com...entity.sinistre" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!-- Privilégier les logs debug de org.hibernate.SQL -->
                <property name="showSql" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
            </bean>
        </property>
    </bean>

2 个答案:

答案 0 :(得分:0)

似乎我必须定义persitence.xml,定义实体和事务查找。有了这个(下面)就可以了。

<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="referentielPersistenceUnit" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
        </properties>
    </persistence-unit>

    <persistence-unit name="habilitationPersistenceUnit" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.prima.solutions.primaclaims.core.entity.habilitation.UtilisateurEntity</class>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
        </properties>
    </persistence-unit>

    <persistence-unit name="sinistrePersistenceUnit" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
        </properties>
    </persistence-unit>

</persistence>

答案 1 :(得分:0)

我只想在这个主题上添加最后一件事。 因为我正在使用带有XA数据源的JTA事务,所以我必须声明一个peristence.xml文件并在JTA查找中设置并声明所有内容。

JTA带来了很多限制,但如果你需要它,你可以在这里找到一个样本。 在大多数情况下,不喜欢使用JTA,声明&amp;设置会更简单。