我使用EntityManager.persist(Object)
方法时遇到问题。现在当我摆脱其他问题时,通过app工作没有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
}
我的道教课程:
@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>
有人知道我缺少什么吗?
答案 0 :(得分:8)
您是否收到特定的例外情况?如果你是的话,知道它是什么会很有帮助。
Stackoverflow上已经存在许多类似的问题:
Spring transactional context doesn't persist data
Spring, Hibernate & JPA: Calling persist on entitymanager does not seem to commit to database
这些建议您应尝试在em.flush()
之后添加em.persist(chain)
,并更改@transactional
注释
您还应该检查是否已通过以下行启用了事务注释:
<tx:annotation-driven transaction-manager="transactionManager"/>
你的.xml配置中的
答案 1 :(得分:7)
试试这个:
em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();
PS:您也应该为您的ID设置生成方法。
答案 2 :(得分:1)
你能发布什么例外吗?我将假设你的错误是你的persistence.xml没有指定你的“链”对象。
您可以使用此标记指定
<exclude-unlisted-classes>false</exclude-unlisted-classes>
或者只是
<class>your.package.Chain</class>
将其放在 provider 标记上方。
此外,永远不要为标记为@Id
的列设置数字当您使用带有设置值的Id列的方法save()时,hibernate 将尝试更新不插入您的数据。
这样做: 创建getEntityManager方法
public EntityManager getEntityManager() {
return entityManager;
}
然后
@Transactional
public void saveChain(Chain chain) {
chain.setDate(new Date());
getEntityManager().persist(chain);
}
答案 3 :(得分:0)
将这些内容添加到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>
答案 4 :(得分:0)
使用
解决了我的问题org.springframework.transaction.jta.JtaTransactionManager
希望这项工作!
答案 5 :(得分:0)
在AppConfig配置文件头
中使用@EnableTransactionManagement答案 6 :(得分:0)
您可以打开新事务,然后提交记录。
@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();
}
答案 7 :(得分:-1)
您需要分配ID生成策略,如下所示:
@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将尝试更新记录,这是不可用的,而不是插入新记录,我认为不会抛出异常。
答案 8 :(得分:-1)
我可以通过将实体添加到 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>