Метод EntityManager persist() не вставляет запись в базу данных

У меня проблема с использованием метода EntityManager.persist(Object). Теперь, когда я избавляюсь от других проблем, при работе приложения без Exception, но объект не помещается в мою базу данных.

мой класс сущностей:

@Entity
@Table(name ="Chain")
public class Chain implements Serializable{

@Id
@Column(name = "id")
  private Long id;
@Column(name = "date")
  private Date date;
@Column(name = "name")
  private String name;
//setters and getters
}

мой класс dao:

@Transactional
@Repository("ChainDao")
public class ChainDaoImpl implements ChainDao{


    private EntityManager em;


    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this. em = em;
    }

    public int saveChain(Chain chain) {
        chain.setDate(new Date());
        chain.setId((long)44);
        Boolean a;
        em.persist(chain);

        return 222;
    }
}

мой контекст xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
    <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"></property></bean>


    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

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

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

и pereistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
       <persistence-unit name="sample">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <!-- Scan for annotated classes and Hibernate mapping XML files -->
        <properties>
           <property name="hibernate.archive.autodetection" value="class, hbm"/>
           <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
           <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/database"/>
           <property name="hibernate.connection.username" value="postgres"/>
           <property name="hibernate.connection.password" value="pwd"/>
           <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
           <property name="hibernate.show_sql" value="true"/>
        </properties>
        </persistence-unit>

    </persistence>

У кого-нибудь есть идея, чего мне не хватает?

Ответ 1

Вы получаете конкретное исключение? Было бы полезно узнать, что это такое, если вы находитесь.

В Stackoverflow есть ряд подобных проблем:

Spring контекст транзакции не сохраняется

Spring, Hibernate и JPA: вызов persist на entitymanager, похоже, не привязан к базе данных

Это означает, что вы должны попробовать добавить em.flush() после em.persist(chain) и изменить аннотации @transactional

Вы также должны проверить, что вы включили транзакционные аннотации через строку, например:

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

в вашей конфигурации .xml

Ответ 2

Попробуйте следующее:

em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();

PS: Вы также должны установить метод генерации для своего идентификатора.

Ответ 3

Можете ли вы опубликовать какое исключение вы получаете? Я предполагаю, что ваша ошибка в том, что ваш persistence.xml не указал свой объект "Цепочка".

Вы можете указать этот тег

<exclude-unlisted-classes>false</exclude-unlisted-classes>

Или просто

 <class>your.package.Chain</class>

Поместите этот тег провайдера.

Кроме того, никогда не устанавливайте число для столбца, помеченного как @Id

Когда вы используете метод save() с столбцом Id с установленным значением, спящий режим попробуем ОБНОВИТЬ НЕ ВСТАВИТЬ ваши данные.

Сделайте это: Создать метод getEntityManager

public EntityManager getEntityManager() {
    return entityManager;
}

Тогда

@Transactional
public void saveChain(Chain chain) {

    chain.setDate(new Date());
    getEntityManager().persist(chain);
}

Ответ 4

Добавление этих данных в ваш web.xml может решить эту проблему:

<!-- Open Entity Manager in View filter -->
<filter>
    <filter-name>openEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>openEntityManagerInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Ответ 5

решил мою проблему, используя

org.springframework.transaction.jta.JtaTransactionManager

надеюсь, что эта работа!

Ответ 6

Использовать @EnableTransactionManagement в заголовке файла конфигурации AppConfig

Ответ 7

Вы можете открыть новую Транзакцию и затем зафиксировать свои записи.

@PersistenceUnit(unitName = "NameOfPersistenceUnit")
private EntityManagerFactory entityManagerFactory;

void someMethod(AccountCommodity accountCommodity){
     EntityManager entityManager = entityManagerFactory.createEntityManager();
     entityManager.getTransaction().begin();
     entityManager.persist(accountCommodity);
     entityManager.flush();
     entityManager.getTransaction().commit();
     entityManager.close();
}

Ответ 8

Вам нужно будет назначить стратегию генерации идентификатора, как показано ниже:

@Entity
@Table(name ="Chain")
public class Chain implements Serializable{

@Id
@Column(name = "id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
  private Long id;
@Column(name = "date")
  private Date date;
@Column(name = "name")
  private String name;
//setters and getters
}

и в режиме сохранения

  public int saveChain(Chain chain) {
        chain.setDate(new Date());
      //chain.setId((long)44);  remove this line
        Boolean a;
        em.persist(chain);

        return 222;
    }

если вы назначаете Id, тогда hibernate/jpa попытается обновить запись, которая недоступна, вместо того, чтобы вставлять новую запись, и я думаю, что не будет генерировать исключение.

Ответ 9

Я смог устранить ту же проблему, добавив Entity в persistence.xml:

<persistence-unit name="OwnerPersistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.test.domain.local.Entity</class>
    <exclude-unlisted-classes />
    </persistence-unit>
</persistence>