Метод 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>