我正在尝试用Spring 3、JPA 2和Hibernate 3制作一个应用程序。我有一个问题,当你坚持一个实体:什么都没发生!数据不插入数据库,也不执行查询。但是,当我使用一个请求,如query.getResultList()选择正常工作。
所以我认为我的问题只是在坚持/更新和事务管理器上,但我不太擅长Spring。你能帮帮我吗?
下面是我的配置文件:
<jee:jndi-lookup id="soireeentreamis_DS" jndi-name="jdbc/soireeentreamis" />
<bean id="persistenceUnitManager"
class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="persistenceXmlLocations">
<list>
<value>classpath*:META-INF/persistence.xml</value>
</list>
</property>
<property name="defaultDataSource" ref="soireeentreamis_DS" />
<property name="dataSources">
<map>
<entry key="soireeentreamisDS" value-ref="soireeentreamis_DS" />
</map>
</property>
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="persistenceUnitManager" />
<property name="persistenceUnitName" value="soireeentreamisPU" />
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
</bean>
</property>
</bean>
<bean id="soireeentreamisTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
</bean>
<tx:annotation-driven transaction-manager="soireeentreamisTransactionManager" />
<context:annotation-config />
</beans>
<persistence-unit name="soireeentreamisPU"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>soireeentreamisDS</non-jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create"/>
</properties>
</persistence-unit>
@Service
@Transactional("soireeentreamisTransactionManager")
public class UserServiceImpl implements UserService ...
@Repository
public class UserDaoImpl extends GenericDaoImpl<User, String> implements
UserDao {
@PersistenceContext(unitName = "soireeentreamisPU")
private EntityManager em;
public void persist(final User entity) {
em.persist(entity);
}
}
谁能帮帮我吗?
您需要将模型对象添加到持久性中。xml文件。在provider元素add的正下方
<class>com.your.domain.object.User</class>
这件事最近发生在我身上。问题是,正如您所说的一个事务性问题,将@事务性注释添加到所有更新数据库的方法中。然后将CGLIB库添加到您的calsspath或添加到您的pom.xml如果您使用Maven,这对于Spring make事务是必要的。即使我以不同的方式做这件事,我希望它能帮助你。这是我的db.xml,我有所有与Spring配置相关的数据库。
<!-- Scans within the base package of the application for @Components to configure as beans -->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<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="${db.dialect}" />
</bean>
</property>
</bean>
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
destroy-method="close">
<property name="driverClass" value="${db.driver}" />
<property name="jdbcUrl" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
<property name="idleConnectionTestPeriodInMinutes" value="1" />
<property name="idleMaxAgeInMinutes" value="4" />
<property name="maxConnectionsPerPartition" value="30" />
<property name="minConnectionsPerPartition" value="10" />
<property name="partitionCount" value="3" />
<property name="acquireIncrement" value="5" />
<property name="statementsCacheSize" value="100" />
<property name="releaseHelperThreads" value="3" />
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="jpaDialect" ref="jpaDialect"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
这是我的persistence.xml
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="pu-app" transaction-type="RESOURCE_LOCAL">
</persistence-unit>
不久前我发现了类似的问题。在我的例子中,我需要在dispacher servlet中添加下面的行。xml。所以我在两个地方需要它(applicationContex.xml和dispacher servlet.xml)
<tx:annotation-driven />
为了澄清一些问题,您没有向服务方法显示“store”对象,但我相信它是用@Transactional注释的,因为您不想创建新的事务。
我有以下JPA实体类。和扩展Project的另一个实体OptProject。我正在使用InheritanceType.Jointed OptProject实体的JPA存储库如下 当我创建一个OptProject并尝试保存它时,我会得到下面的错误消息。这对我来说毫无意义,因为我使用@GeneratedValue(Streaty=GenerationType.Identity)为SQL server生
对于新学生和新课程的情况,它工作得很好,但是在新课程和现有学生的情况下,我会从数据库中抛出一个唯一的约束冲突。关系类似于下面。 在持久化之前,我尝试使用entitymanager查找一个学生,如果该学生存在,则使用该实例而不是新的学生实例。这也不起作用,它仍然尝试执行插入而不是更新
问题内容: 我有一个数据库视图,该视图产生的结果集没有真正的主键。我想使用Hibernate / Persistence将结果集映射到Java对象上。当然,因为没有PK,所以我不能用修饰任何字段。 部署时,Hibernate抱怨缺少该组件。我该如何解决? 问题答案: 如果存在使行唯一的列组合,请围绕列组合建模主键类。如果没有,您基本上就不走运了-但您应该重新检查视图的设计,因为它可能没有意义。 有
断言我们有一个存储库,如下所示: 通过扩展接口,存储库继承了以下方法: 现在,我注意到,如果在调用此方法后收到对ExampleObject的引用,那么对此方法所做的任何操作都会自动保存到数据库中,例如: 通过阅读主题,我理解了这一点,这表示实例是。 这与我的预期背道而驰。我预计需要使用从继承的save方法来保存更改: 有没有人愿意确认从Spring Data JPA存储库返回的对象仍然作为标准附加
尝试获取父实体(Msg)的实体,其中父PK (msg_id)是子实体中的FK时,尝试保持子实体(MsgRetry)时出错。 错误,如:org.hibernate.id.IdentifierGenerationException:试图从null一对一属性分配id 父实体,不需要知道子实体(至少我认为它不需要知道)。一旦子实体被持久化,我就会尝试也持久化父实体。我可以通过在子实体中没有父实体并调用关联
我有一个实体,代表客户发送的订单,这个订单可能会在电话上与客户讨论后更新,但客户发送的初始订单必须保持不更新。我如何可以保持同一实体两次,是否有效的使用深层克隆。我试图分离实体以便持久化上下文持久化一个新的,但是持久化上下文仍然在更新第一个条目。