我在网站上使用JPA.在探索了保存数据的选项后,我找到了2种方法.第一种方法是使用javax.persistence.EntityManager的实现.我使用LocalContainerEntityManagerFactoryBean来实例化EntityManager的实例.一旦我获得了EntityManager的实例,我就可以用它来保存实体.例如,
entityManager.merge(someEntity);
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用org.springframework.data.repository.CrudRepository的实例.一,我获得了一个CrudRepository的实例,我可以用它来保存一个实体.例如,
aCrudRepository.save(someEntity);
Run Code Online (Sandbox Code Playgroud)
使用EntityManager和CrudRepository将实体持久化到数据库之间有什么区别?这两种方法(实体管理器与crud存储库)有什么好处或坏处?
是否可以使用Spring Data JPA(由Hibernate作为JPA提供程序支持)并同时直接使用Hibernate?
问题是,当我使用JpaTransactionManager时,我无法检索当前会话org.hibernate.HibernateException: No Session found for current thread.当我切换到HibernateTransaction管理器时,JPA存储库无法提交更改.
这是我的Spring上下文的一部分(使用该上下文我不能使用直接的Hibernate调用):
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/IPGCONF"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:dataSource-ref="dataSource">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="entityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<jpa:repositories base-package="com.satgate"/>
Run Code Online (Sandbox Code Playgroud)
hibernate存储库的示例:
public Collection<Layer> listCurrent(Carrier carrier) {
Criteria query = sessionFactory.getCurrentSession()
.createCriteria(Layer.class)
.add(Restrictions.eq("carrier", carrier));
query.createCriteria("bitrate")
.addOrder(Order.desc("bitrate"))
.add(Restrictions.eq("symbolrate", carrier.getSymbolrate()));
return query.list();
}
Run Code Online (Sandbox Code Playgroud)
Spring数据存储库定义的示例:
public interface BitrateRepository extends PagingAndSortingRepository<Bitrate, Long> …Run Code Online (Sandbox Code Playgroud) 我之前没有使用过Spring Data,但是我已经多次使用Hibernate ORM用于基于MySQL的应用程序.我只是不明白为基于MongoDB的应用程序在两者之间选择哪个框架.
我已经尝试寻找答案,但我找不到在生产环境中对两者进行比较的答案.有没有人发现使用MongoDB使用这两个框架有问题?
spring mongodb spring-data spring-data-mongodb hibernate-ogm
是否有可能在Spring Boot中集成Spring管理的Hibernate拦截器(http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch14.html)?
我正在使用Spring Data JPA和Spring Data REST,并且需要一个Hibernate拦截器来对实体上的特定字段进行更新.
使用标准JPA事件,不可能获得旧值,因此我认为我需要使用Hibernate拦截器.
hibernate spring-data spring-data-jpa spring-data-rest spring-boot
我已经使用Spring Data JPA设置了一个spring boot项目,但我没有看到Spring数据jpa的智能.

屏幕截图显示问题,我的餐厅实体有一个变量调用restaurantAddress,我试图让intelliJ帮助我完成编码,但没有智能显示.
我的项目设置如下:
申请类:
@SpringBootApplication
@ComponentScan(basePackages = {"com.mycompany"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>food</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.7.RELEASE</version>
</parent>
<dependencies>
<!-- Dependencies for RESTful Web Services -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Dependencies for JPA Data Persistence -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--JDBC-->
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
</dependencies>
<build>
<finalName>food</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration> …Run Code Online (Sandbox Code Playgroud) 在我有限的经验中,我一再被告知你不应该将实体传递到前端或通过休息,而是使用DTO.
Spring Data Rest不是这样做的吗?我简要介绍了一些预测,但这些似乎只是限制了返回的数据,并且仍然期望一个实体作为post方法的参数来保存到数据库中.我在这里错过了什么,或者我(和我的同事)是不正确的,因为你不应该传递和实体?
rest spring domain-driven-design spring-data spring-data-rest
问题基本上与下面的问题相同:
JPA级联持久化并且对分离实体的引用会抛出PersistentObjectException.为什么?
我正在创建一个引用现有的独立实体的新实体.现在,当我在Spring数据存储库中保存此实体时,会抛出异常:
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist
Run Code Online (Sandbox Code Playgroud)
如果我们看一下spring数据JPA的源代码中的save()方法,我们看到:
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们看看isNew()in AbstractEntityInformation
public boolean isNew(T entity) {
return getId(entity) == null;
}
Run Code Online (Sandbox Code Playgroud)
所以基本上如果我保存()一个新实体(id == null),spring数据将始终调用persist,因此这种情况总是会失败.
在向集合添加新项目时,这似乎是一个非常典型的用例.
我该如何解决这个问题?
编辑1:
注意:
此问题与如何保存引用Spring JPA中现有实体的新实体没有直接关系?.详细说明假设您获得了通过http创建新实体的请求.然后,您从请求中提取信息,并创建您的实体和现有的实体.因此,他们将永远脱离.
我有一个简单的Spring Boot应用程序,它连接到PostgreSQL数据库并充当JSON服务.不知怎的,创业公司变得非常慢,见时间10:37:10和10:38:00:
2015-05-09 10:37:09.649 INFO 20880 --- [lication.main()] o.apache.catalina.core.StandardService : Starting service Tomcat
2015-05-09 10:37:09.651 INFO 20880 --- [lication.main()] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.20
2015-05-09 10:37:09.767 INFO 20880 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2015-05-09 10:37:09.767 INFO 20880 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2970 ms
2015-05-09 10:37:09.979 INFO 20880 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2015-05-09 10:37:09.985 INFO 20880 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-05-09 …Run Code Online (Sandbox Code Playgroud) 您是否应该在JPA中为每个表创建一个存储库?如果没有,您如何解决存储库数据库中的泛型?
例如,下面是一个StoreRepository.它处理对象的CRUD操作Store.如果我希望存储库也保存一个StoreEvent对象,我将如何更改下面的接口以容纳这两个对象?
@Repository
public interface StoreRepository extends JpaRepository<Store, String> {
public Store findByGuid(String guid);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用spring数据(mongoDb),我有我的存储库:
public interface StoriesRepository extends PagingAndSortingRepository<Story, String> {}
Run Code Online (Sandbox Code Playgroud)
然后我有一个控制器:
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<Page<StoryResponse>> getStories(Pageable pageable) {
Page<StoryResponse> stories = storiesRepository.findAll(pageable).map(StoryResponseMapper::toStoryResponse);
return ResponseEntity.ok(stories);
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但我无法使用RestTemplate getForEntity方法使用我的端点:
def entity = restTemplate.getForEntity(getLocalhost("/story"), new TypeReference<Page<StoryResponse>>(){}.class)
Run Code Online (Sandbox Code Playgroud)
我应该提供什么类来成功反序列化我的实体页面?
spring-data ×10
spring ×7
java ×4
jpa ×3
hibernate ×2
rest ×2
spring-boot ×2
merge ×1
mongodb ×1
persist ×1
postgresql ×1