标签: spring-data

Spring Data + JPA具有多个数据源但只有一组存储库

我今天一直在研究这一组,我开始认为我想要做的事情可能是不可能的,所以我转向你,强大的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)数据库.每个传入请求中包含的凭据将包含一个字段,该字段告知应用程序要转到哪个数据库以满足该请求.每个数据库的模式都是相同的,因此不需要为每个数据库提供单独的存储库接口.

经过相当数量的谷歌搜索后,很明显这是一个常见的场景.以机智:

java spring jpa spring-data spring-data-jpa

20
推荐指数
1
解决办法
2万
查看次数

JPA标准API - 与Spring Data JPA规范中的列表匹配

我想创建一个规范,将一个用户对象的组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)

如果我不在,我怎么办呢?

jpa criteria-api spring-data

20
推荐指数
1
解决办法
2万
查看次数

如何缩短Spring Data JPA存储库中查询方法的名称?

考虑一下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-data spring-data-jpa

20
推荐指数
2
解决办法
6344
查看次数

Spring Data JPA是JPA实现吗?

我试图"真正"理解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 hibernate jpa spring-data spring-data-jpa

20
推荐指数
1
解决办法
4129
查看次数

Spring JPA存储库事务性

关于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

java jpa spring-transactions spring-data

20
推荐指数
1
解决办法
1万
查看次数

表'DBNAME.hibernate_sequence'不存在

我有一个使用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的任何缺点.

java mysql spring spring-data spring-boot

20
推荐指数
5
解决办法
2万
查看次数

Spring Data JPA - 注入失败 - BeanCreationException:无法自动装配字段

我按照这里发布的教程获得了一个基础应用程序来使用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)

java spring annotations spring-data spring-data-jpa

19
推荐指数
1
解决办法
5万
查看次数

Spring JpaRepostory delete vs deleteInBatch

Spring中JpaRepostory delete(...)deleteInBatch(...)方法有什么区别?第二个"删除一个SQL语句中的项目",但从应用程序/数据库的角度来看它意味着什么?为什么存在两种具有相似结果的不同方法,何时使用一种或另一种更好?

编辑: 这同样也适用于deleteAll()deleteAllInBatch()...

java spring spring-data

19
推荐指数
3
解决办法
2万
查看次数

javax.persistence.Id和org.springframework.data.annotation.Id有什么区别?

我很想之间是否存在的差异javax.persistence.Idorg.springframework.data.annotation.Id.

  1. 如果Spring创建该注释仅用于支持JPA注释,那么为什么呢?
  2. 是否org.springframework.data.annotation.Id有另一个[附加]目的是什么?

java spring-data javax.persistence

19
推荐指数
1
解决办法
4620
查看次数

在实体类java.time.ZonedDateTime上找不到属性null以将构造函数参数绑定到

我有以下配置

组态

@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

19
推荐指数
1
解决办法
1849
查看次数