EntityManager persist()不保存任何数据库

iva*_*var 28 java spring hibernate jpa

我的entityManager persist()从序列获取id并将其放到我的Image对象中,但Image对象本身没有显示在数据库中.EntityManager.flush()给出了一个错误,所以我不能这样提交.这是我的代码.

@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);
}
Run Code Online (Sandbox Code Playgroud)

 

@Repository
public class BaseDao {

private JpaTemplate jpaTemplate;


public JpaTemplate getJpaTemplate(EntityManager entityManager){
    if(jpaTemplate == null)
        jpaTemplate = new JpaTemplate(entityManager);
    return jpaTemplate;
}
Run Code Online (Sandbox Code Playgroud)

 

<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" />
Run Code Online (Sandbox Code Playgroud)

Pre*_*raj 28

这通常发生在未应用交易时..我怀疑@Transactional拦截器没有正确拦截.

  • 还有一件事需要检查:确保`@Transactional`注释来自包'org.springframework.transaction.annotation`,而不是`javax.transaction` - 第二个在我的情况下不起作用. (3认同)
  • @Gondy 先生,刚刚结束了我长达 2 小时的痛苦。非常感谢 ! (2认同)

Koz*_*łek 27

persist()表示"将对象添加到托管条目列表".要将对象保存到数据库,必须调用flush()方法.但请记住,您必须在交易中打电话.

//编辑:示例保存方法.

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();
}
Run Code Online (Sandbox Code Playgroud)

这不是你能做的最好的,但足够好.

  • flush()在提交之前调用. (7认同)