我对Spring Data-JPA和JPA之间的区别感到有点困惑.我知道JPA它是使用流行的ORM技术将Java对象持久化到关系数据库的规范,即换句话说,JPA提供接口和其他ORM技术,实现称为JPA提供程序的接口,例如Hibernate.
现在究竟是什么Spring Data JPA.Spring Data JPA是否在JPA上增加了一些功能(接口),仍然只是指定它还是JPA提供者?
我看到Spring Data JPA围绕存储库工作(DAO层:如果我没有错).所以我的意思是使用'Spring Data JPA + Hibernate'或仅使用'Hibernate'指导它是如何不同的?
我有一个依赖的Spring Boot应用程序spring-boot-starter-data-jpa.我的实体类有一个带有列名的列注释.例如:
@Column(name="TestName")
private String testName;
Run Code Online (Sandbox Code Playgroud)
由此生成的SQL创建test_name为列名.在寻找解决方案后,我发现spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy解决了问题(列名取自列注释).
不过,我的问题是为什么没有设置为EJB3NamingStrategyJPA的naming_strategy 忽略列注释?也许hibernate方言与它有关?我正在连接到MS SQL 2014 Express,我的日志包含:
Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect
Run Code Online (Sandbox Code Playgroud) 我们对PDF文档中的字体有一点问题.为了解决我想检查的问题,哪些字体实际嵌入在pdf文档中,哪些字体仅被引用.是否有一种简单(廉价和免费)的方式呢?
我在扩展JPaRepository的界面中编写了一个删除某些对象的查询,但是当我执行查询时它抛出异常!谁能为我解释一下,并提前谢谢你:)
查询:
public interface LimitRepository extends JpaRepository<CLimit, Long> {
@Query("delete from CLimit l where l.trader.id =:#{#trader.id}")
void deleteLimitsByTrader(@Param("trader") CTrader trader);
}
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误,可以任意请,为我解释一下,谢谢大家:)
例外:
org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [delete from com.query.domain.CLimit l where l.trader.id =:__$synthetic$__1]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.errorIfDML(QueryTranslatorImpl.java:318)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:369)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:495)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:364)
at com.sun.proxy.$Proxy98.getSingleResult(Unknown Source)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:206)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:78)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:102)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:92)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:482)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) …Run Code Online (Sandbox Code Playgroud) 我定义了以下实体:
@Entity
@Table(name = "EmailTemplate")
public class EmailTemplate {
Run Code Online (Sandbox Code Playgroud)
尽管有表格注释,但我收到了java.sql.SQLException: Invalid object name 'email_template'.如何防止将诸如EmailTemplate之类的实体类转换为email_template表名?
编辑:
我正在使用Spring Boot:启动JPA.从我的build.gradle文件,
compile("org.springframework.boot:spring-boot-starter-data-jpa")
Run Code Online (Sandbox Code Playgroud) 虽然不是新手,但我正在努力学习弹簧框架(再次!),以确保我真正理解这一点.我对核心Spring(DI)有了一个很好的想法.现在,我专注于数据层.
我遇到过" Spring and Hibernate " 这个词.我可以解释它意味着将Spring Framework与Hibernate一起用作ORM工具/ JPA提供程序.
现在我遇到了" Spring Data JPA ".我澄清了有关Spring Data JPA的内容,它是JPA的一个抽象层(在Spring Data JPA下使用Hibernate或任何其他JPA提供程序).
现在这些术语是一样的吗?也就是说," Spring + hibernate "与" Spring Data JPA "相同.如果没有,那么差异/相似之处是什么?
我真的很困惑很多条款/声明(如上所述)似乎相似,但可能会有所不同.
我们将Spring 4.0.1.RELEASE与jdk6结合使用(这是固定的).当然,我们使用@PropertySource注释来完成Java中的配置.当我们使用gradle编译项目时,这会导致恼人的警告消息:
org\springframework\context\annotation\PropertySource.class(org\springframework\context\annotation:PropertySource.class):警告:在类型'java.lang.annotation.Repeatable'中找不到annotat ion方法'value()':class找不到java.lang.annotation.Repeatable的文件
这是由于使用not(在jdk6中)现有的Repeatable类引起的,我很高兴它只是一个警告.我喜欢gradle的干净输出,这只是令人讨厌,因为它可能会混淆其他"真正的"警告(如checkstyle ......).
也许任何人都遇到了同样的问题,并为这种情况得到了一个(不是那么多黑客)解决方案.我只想再次看到干净的输出.
我有简单的spring-jpa配置,我配置了Hibernate ImprovedNamingStrategy.这意味着如果我的实体类有一个变量userName,那么Hibernate应该将它转换user_name为查询数据库.但是在我升级到Hibernate 5后,这个命名转换停止了工作.我收到错误:
错误:"字段列表"中的未知列'user0_.userName'
这是我的Hibernate配置:
@Configuration
@EnableJpaRepositories("com.springJpa.repository")
@EnableTransactionManagement
public class DataConfig {
@Bean
public DataSource dataSource(){
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/test");
ds.setUsername("root");
ds.setPassword("admin");
return ds;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setShowSql(Boolean.TRUE);
vendorAdapter.setDatabase(Database.MYSQL);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setDataSource(dataSource());
factory.setPackagesToScan("com.springJpa.entity");
Properties jpaProperties = new Properties();
jpaProperties.put("hibernate.ejb.naming_strategy","org.hibernate.cfg.ImprovedNamingStrategy");
jpaProperties.put("hibernate.dialect","org.hibernate.dialect.MySQL5InnoDBDialect");
factory.setJpaProperties(jpaProperties);
factory.afterPropertiesSet();
return factory;
}
@Bean
public SharedEntityManagerBean entityManager() {
SharedEntityManagerBean entityManager = new SharedEntityManagerBean();
entityManager.setEntityManagerFactory(entityManagerFactory().getObject());
return entityManager;
}
@Bean
public …Run Code Online (Sandbox Code Playgroud) 我有一个Spring MVC控制器,它使用Spring-Data的分页支持:
@Controller
public class ModelController {
private static final int DEFAULT_PAGE_SIZE = 50;
@RequestMapping(value = "/models", method = RequestMethod.GET)
public Page<Model> showModels(@PageableDefault(size = DEFAULT_PAGE_SIZE) Pageable pageable, @RequestParam(
required = false) String modelKey) {
//..
return models;
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用漂亮的Spring MVC测试支持测试RequestMapping.为了使这些测试保持快速并与所有其他内容隔离开来,我不想创建完整的ApplicationContext:
public class ModelControllerWebTest {
private MockMvc mockMvc;
@Before
public void setup() {
ModelController controller = new ModelController();
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Test
public void reactsOnGetRequest() throws Exception {
mockMvc.perform(get("/models")).andExpect(status().isOk());
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法适用于其他控制器,它们不期望使用Pageable,但是有了这个,我得到了一个很好的长Spring堆栈跟踪.它抱怨无法实例化Pageable:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is …Run Code Online (Sandbox Code Playgroud) hibernate ×5
java ×5
jpa ×4
spring ×3
spring-boot ×2
eclipse ×1
fonts ×1
hql ×1
jpa-2.0 ×1
orm ×1
pdf ×1
plugins ×1
product ×1
rcp ×1
spring-data ×1
spring-mvc ×1
spring-orm ×1
testing ×1