wake-up-neo.com

EntityManager persist () speichert nichts in der Datenbank

Mein entityManager persist () erhält die ID aus der Sequenz und legt sie in meinem Image-Objekt ab, das Image-Objekt selbst wird jedoch nicht in der Datenbank angezeigt. EntityManager.flush () gibt einen Fehler aus, sodass ich auf diese Weise nicht festlegen kann. Hier ist mein 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

Dies geschieht im Allgemeinen, wenn die Transaktion nicht angewendet wird. 

26
Premraj

persist() bedeutet "Objekt zur Liste der verwalteten Einträge hinzufügen". Um das Objekt in der Datenbank zu speichern, müssen Sie die flush()-Methode aufrufen. Denken Sie jedoch daran, dass Sie sich in der Transaktion anmelden müssen.

//Edit:Example Speichermethode. 

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();
}

Das ist nicht das Beste, was man machen kann, aber gut genug.

27
Koziołek

Überprüfen Sie Ihre Serverprotokolle. Erstellen Sie eine neue EntityManger? und haben die Transaktion noch nicht begonnen. Ich denke, wo Sie angefangen haben, ist das ein anderes EntityManager Objekt.

1
Atul Jain

Dieses Problem trat mir beim Ausführen von Testfällen mit SpringJUnit4ClassRunner auf.

Ich habe es gelöst, indem Die Testfunktion mit 

@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);
}

hoffe das hilft dir 

0

Überprüfen Sie Ihren mvc-dispatcher-servlet.xml. Hier in <context:component-scan base-package="pass"/> pass sollte das Paket sein, wo sich Ihre Controller befinden

0
zafezo