【问题标题】:Entity is not persisted实体未持久化
【发布时间】:2015-08-01 22:04:34
【问题描述】:

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

为了测试 JPA,我将它设置在一个不与任何其他实体链接的简单实体上。

选择和 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>

【问题讨论】:

  • 你能发布你的休眠配置吗?
  • 发布你的spring配置
  • 我已经更新了最初的帖子并设置了我的配置。有一个特殊性,我没有persistence.xml文件可能是pb在这里
  • 我感觉您使用的@Transactional 注释没有为数据库设置正确的事务。例如,transactionManager 如何知道它应该在referentiel / habilitation / referentiel 中启动事务?
  • @Transactional 在我的配置中设置了 JTA transactionManager。对于会话工厂,它是正确的。两者之间是有区别的。会话工厂具有“hibernate.transaction.manager_lookup_class”属性,但没有我的实体管理器

标签: spring hibernate jpa


【解决方案1】:

我只想添加关于这个主题的最后一件事。 因为我将 JTA 事务与 XA 数据源一起使用,所以我必须声明一个 peristence.xml 文件并在 JTA 查找中设置并声明所有实体。

JTA 带来了很多限制,但如果您需要,您可以在此处获取示例。 在大多数情况下不喜欢使用 JTA,声明和设置会更简单。

【讨论】:

    【解决方案2】:

    看来我必须定义一个 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 2016-03-28
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多