我今天一直在研究这一组,我开始认为我想要做的事情可能是不可能的,所以我转向你,强大的Stackoverflow,寻求帮助.
我正在用Java构建RESTful服务平台,Spring Data 3.1.2 + JPA作为我的持久层(如此处所述).我的数据模型对象都是作为扩展Spring JpaRepository接口的接口实现的.我已经把所有东西连接起来并且使用单个数据源很好地工作,如本例所示(请注意,显示的数据源是Derby,但这仅用于开发目的;在生产中,我们将使用Oracle):
<jpa:repositories base-package="com.my.cool.package.repository"/>
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
</property>
<property name="packagesToScan" value="com.my.cool.package" />
<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
</bean>
<bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="url" value="jdbc:derby:derbyDB" />
<property name="username" value="dev" />
<property name="password" value="notARealPassword" />
</bean>
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.DerbyTenSevenDialect" />
</bean>
Run Code Online (Sandbox Code Playgroud)
问题是该应用程序需要连接到多个(Oracle)数据库.每个传入请求中包含的凭据将包含一个字段,该字段告知应用程序要转到哪个数据库以满足该请求.每个数据库的模式都是相同的,因此不需要为每个数据库提供单独的存储库接口.
经过相当数量的谷歌搜索后,很明显这是一个常见的场景.以机智:
我想创建一个规范,将一个用户对象的组ID与一个id列表相匹配.我正在考虑使用isMember(就像在代码中一样),但该方法不会采用该列表.
public static Specification<User> matchCompanyIdsList(final List<Long> groupIds){
return new Specification<User>() {
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder){
final Path<Group> group = root.<Group> get("group");
return builder.isMember(company.<Long>get("id"), companyIds);
}
};
}
Run Code Online (Sandbox Code Playgroud)
如果我不在,我怎么办呢?
考虑一下Spring Data Jpa存储库:
public interface UserRepository extends JpaRepository<User, Long> {
User findOneByDeletedIsFalseAndActivationKey(String activationKey);
List<User> findAllByDeletedIsFalseAndActivatedIsFalseAndCreatedDateBefore(DateTime dateTime);
User findOneByDeletedIsFalseAndLogin(String login);
User findOneByDeletedIsFalseAndEmail(String email);
}
Run Code Online (Sandbox Code Playgroud)
请注意每个方法中都有" DeletedIsFalse".有一种简单的方法可以缩短方法名称吗?喜欢ie:
@FullMethodName("findOneByDeletedIsFalseAndEmail")
User findOneByEmail(String email);
Run Code Online (Sandbox Code Playgroud) 我试图"真正"理解Spring Framework.我对Spring Core(DI)和Spring MVC有了一些了解.
对于数据部分,我现在专注于Spring Data JPA.据我所知,JPA是一个标准规范,有多个实现,Hibernate是着名的.
现在,当我启动Spring Data JPA时,我的印象是Spring Data JPA是JPA规范的独立实现.原来我错了.
如果我理解正确,Spring Data JPA是Spring提供的抽象层,它在内部使用其他JPA提供程序(示例Hibernate),所以通常它是这样的:
Application ---> Spring Data JPA --> Hiberate --> JDBC ----> DB
我的理解是否正确?如果是这样没有Spring Data JPA误导?它本身不是JPA提供者,它只是一个抽象层,它在其他层之上工作JPA provider.
我不确定我是否真的了解Spring框架,或者它是一个复杂的框架?
有人可以帮我理解吗?
关于Spring JPA存储库事务性的1个快速问题.我有一个未标记为事务性的服务,并调用Spring JPA存储库方法
userRegistrationRepository.deleteByEmail(email);
Run Code Online (Sandbox Code Playgroud)
它被定义为
@Repository
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> {
UserRegistration findByEmail(String email);
void deleteByEmail(String email);
}
Run Code Online (Sandbox Code Playgroud)
问题是它失败了" 没有实体事务可用于当前线程的EntityManager - 无法可靠地处理'删除'调用;嵌套异常是javax.persistence.TransactionRequiredException "异常.
好吧,我可以通过将服务或 deleteByEmail(..)方法标记为事务来解决它,但我无法理解为什么它现在崩溃.Spring文档明确声明" 默认情况下,存储库实例上的CRUD方法是事务性的. "(http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions),但显然这个不是......那么这个陈述只与成员有关CrudRepository吗?
ps:那是Spring Data JPA 1.9.4
我有一个使用spring data/jpa的SpringBoot 2.0.1.RELEASE应用程序
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是当我在Amazon Aurora数据库中进行更新时,我收到此错误:
2018-04-13 09:20 [pool-1-thread-1]错误ohid.enhanced.TableStructure.execute(148) - 无法读取hi值com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表'elbar sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)中不存在.hibernate_sequence'
我在要保存的实体中有这个
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
Run Code Online (Sandbox Code Playgroud)
我想避免在DB中获取ID的任何缺点.
我按照这里发布的教程获得了一个基础应用程序来使用Spring Data JPA.现在,我如何理解,使用配置
<jpa:repositories base-package="my.package.to.scan" />
Run Code Online (Sandbox Code Playgroud)
应该导致Spring Data JPA扫描的包用于扩展接口JpaRepository并创建它的concreate bean,因此可以使用简单的Spring在我的服务类中的任何地方使用它@Autowired.但它失败了,说它找不到带有className的bean(这是bean在创建时获得的默认名称,只需使用去大写的ClassName).
但是,当我在我的applicationContext中配置bean manualy时,如下所示:
<bean id="ClassName" class="my.package.to.scan.ClassName"/>
Run Code Online (Sandbox Code Playgroud)
Spring能够找到豆子.我当然得到一个错误,因为我想从一个接口创建一个bean,这显然是行不通的.但问题是,似乎Spring Data JPA"自动bean创建"似乎以某种方式失败了.
我附上相关代码,以便您查看.顺便说一句,我应该提一下,我正在开发一个portlet,所以不要奇怪为什么我没有spring-config.我目前只使用applicationConfig和一个MyPortlet-Portlet.xml进行portlet配置(但这不应该与此问题相关).我添加了import语句只是为了确保我没有使用错误的注释/类.
applicationContext.xml中
<beans *** ALL MY XMLN's and XSI's *** />
<context:annotation-config />
<jpa:repositories base-package="model.repositories" />
// JPA specific configuration here: dataSource, persistenceUnitManager exceptionTranslator, entityManagerFactory, SessionFactory, transactionManager - should not be relevant for this problem, tell me if i'm wrong
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
Run Code Online (Sandbox Code Playgroud)
ICustomerService - 只是CustomerService的一个接口
import model.entities.Customer;
public interface ICustomerService {
// example method
public …Run Code Online (Sandbox Code Playgroud) Spring中JpaRepostory delete(...)和deleteInBatch(...)方法有什么区别?第二个"删除一个SQL语句中的项目",但从应用程序/数据库的角度来看它意味着什么?为什么存在两种具有相似结果的不同方法,何时使用一种或另一种更好?
编辑:
这同样也适用于deleteAll()和deleteAllInBatch()...
我很想之间是否存在的差异javax.persistence.Id和org.springframework.data.annotation.Id.
org.springframework.data.annotation.Id有另一个[附加]目的是什么?我有以下配置
@Configuration
@EnableMongoRepositories(basePackages = Constants.DATA_SCAN)
@EnableMongoAuditing(auditorAwareRef = "auditorAwareService")
@Import(value = MongoAutoConfiguration.class)
public class DatabaseConfiguration {
@Bean
public ValidatingMongoEventListener validatingMongoEventListener() {
return new ValidatingMongoEventListener(validator());
}
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
@Bean
public CustomConversions customConversions() {
final List<Converter<?, ?>> converters = new ArrayList<>();
converters.add(DateToZonedDateTimeConverter.INSTANCE);
converters.add(ZonedDateTimeToDateConverter.INSTANCE);
return new CustomConversions(converters);
}
}
Run Code Online (Sandbox Code Playgroud)
我添加了自定义转换器,但我仍然得到:
在实体类java.time.ZonedDateTime上找不到属性null以将构造函数参数绑定到!
@Document(collection = "user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String id;
@Field("reset_date")
private ZonedDateTime resetDate = …Run Code Online (Sandbox Code Playgroud) java spring-data spring-data-mongodb jhipster spring-mongodb
spring-data ×10
java ×7
spring ×5
jpa ×4
annotations ×1
criteria-api ×1
hibernate ×1
jhipster ×1
mysql ×1
spring-boot ×1