web-dev-qa-db-fra.com

EntityManager persist () n'enregistre rien dans la base de données

Mon entityManager persist () obtient l'identifiant de la séquence et le met dans mon objet Image mais celui-ci ne s'affiche pas dans la base de données. EntityManager.flush () génère une erreur, je ne peux donc pas commettre de cette façon. Voici mon code. 

@Repository
public class ImageDaoImpl extends BaseDao implements ImageDao {

@PersistenceContext
protected EntityManager entityManager;

@Override
@Transactional
public void create(Image image) {       
    JpaTemplate jpaTemplate = getJpaTemplate(entityManager);
    jpaTemplate.persist(image);
}

@Repository
public class BaseDao {

private JpaTemplate jpaTemplate;


public JpaTemplate getJpaTemplate(EntityManager entityManager){
    if(jpaTemplate == null)
        jpaTemplate = new JpaTemplate(entityManager);
    return jpaTemplate;
}

<bean id="entityManagerFactory"
       class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
       p:dataSource-ref="dataSource">
       <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="true" />
                <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
            </bean>
        </property>
        <property name="persistenceUnitName" value="sample"></property>
    </bean>



    <!-- DataSource Setup -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:5432/imageCapture" />
        <property name="username" value="myusername" />
        <property name="password" value="mypassword" />
    </bean>


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

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

Cela se produit généralement lorsque la transaction n'est pas appliquée. Je doute que l'intercepteur de transaction ne intercepte pas correctement. 

26
Premraj

persist() signifie "ajouter un objet à la liste des entrées gérées". Pour enregistrer un objet dans la base de données, vous devez appeler la méthode flush(). Mais rappelez-vous que vous devez appeler à l'intérieur de la transaction.

//Edit:Example save method. 

public void save(T t){
    // begin transaction 
    em.getTransaction().begin();
    if (!em.contains(t)) {
        // persist object - add to entity manager
        em.persist(t);
        // flush em - save to DB
        em.flush();
    }
    // commit transaction at all
    em.getTransaction().commit();
}

Ce n'est pas ce que vous pouvez faire de mieux, mais suffisamment bon.

27
Koziołek

Vérifiez les journaux de votre serveur. Créez-vous une nouvelle variable EntityManger? et n'ont pas commencé la transaction. Je pense que là où vous avez commencé, c’est un autre objet EntityManager.

1
Atul Jain

J'ai rencontré ce problème lors de l'exécution de scénarios de test avec SpringJUnit4ClassRunner

Je l'ai résolu en En enveloppant la fonction de test avec 

@Autowired
private PlatformTransactionManager transactionManager;

// in your test funciton 
// Declare a transaction programmatically to be able to rollback.
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
transactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus transaction = transactionManager.getTransaction(transactionDefinition);

try {
    // here test of Dao goes
} finally {
    transactionManager.rollback(transaction);
}

espérons que cela vous aide 

0
Basheer AL-MOMANI

Vérifiez votre mvc-dispatcher-servlet.xml. Ici, dans <context:component-scan base-package="pass"/>, pass devrait être égal à package où se trouvent vos contrôleurs.

0
zafezo