标签: spring-data

Spring Data MongoDB尝试为自定义存储库方法生成查询

基于Spring Data Document文档,我提供了一个存储库方法的自定义实现.自定义方法的名称是指域对象中不存在的属性:

@Document
public class User {
    String username;
}

public interface UserRepositoryCustom {
    public User findByNonExistentProperty(String arg);
}

public class UserRepositoryCustomImpl implements UserRepositoryCustom {
    @Override
    public User findByNonExistentProperty(String arg) {
        return /*perform query*/;
    }
}

public interface UserRepository
        extends CrudRepository<?, ?>, UserRepositoryCustom {

    public User findByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)

但是,也许是因为我选择了方法名称(findByNonExistentPropertyName),Spring Data尝试解析方法名称,并从中创建查询.当它找不到nonExistentProperty时User,会抛出异常.

可能的决议:

  1. 我在如何提供自定义方法的实现方面犯了错误吗?
  2. 有没有办法指示Spring不尝试根据此方法的名称生成查询?
  3. 我是否必须避免使用Spring Data识别的任何前缀?
  4. 以上都不是.

谢谢!

java mongodb spring-data spring-data-document

9
推荐指数
1
解决办法
3101
查看次数

Spring Hibernate与jdbc模板对比spring春天

我们有一个以MySQL数据库和Spring为框架的项目.我是Spring的新手,希望实现数据库访问层,并发现有几个选项,比如

  • 使用Spring + Hibernate
  • 使用Spring JDBC模板
  • 使用Spring ORM模块

我已经浏览了stackoverflow中的各个帖子,并在网上进行了一些研究,但每个问题都有不同的答案支持不同的选项.此外,我确实看到提及现在不推荐使用Spring JDBC模板.

该应用程序每小时可能有大约1000个事务,大约有60%的读取和40%的写入.

任何人都可以帮我找到答案,哪3个选项适合哪个,为什么?或者,如果你能指出一些资源,那也将受到高度赞赏.

hibernate spring-orm spring-data

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

MongoDB Lifecycle事件访问MongoTemplate

我正在尝试使用Spring Data Mongodb为我的mongodb文档实现版本控制系统.我以为我会利用Mongo生命周期事件

Spring中的Mongo生命周期事件

我想要做的是听取onBeforeSave并获取文档的原始版本,并获得两者之间的差异.

@Override
public void onBeforeSave(Table table, DBObject dbo) {

    if (table.getId() != null) {
        TableChange change = new TableChange();

        Table beforeTable = mongoOperations.findById(table.getId(), Table.class);

        if (!beforeTable.getName().equals(table.getName())) {
            change.setName(table.getName());
        }

        MapDifference<String, Column> diff = Maps.difference(beforeTable.getColumns(), table.getColumns());

        logger.debug(diff.entriesInCommon().toString());
        logger.debug(diff.entriesDiffering().toString());
        logger.debug(diff.entriesOnlyOnLeft().toString());
        logger.debug(diff.entriesOnlyOnRight().toString());         

        table.addChange(change);
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我无法获得对mongoOperations的引用.它不断创建循环引用.是否我@Autowire:

自动注射

Mongo配置:

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
    <constructor-arg name="mongoConverter" ref="fooConverter" />
    <property name="writeResultChecking" value="EXCEPTION" />
</bean>

<bean class="com.example.listener.document.TableListener"></bean>
Run Code Online (Sandbox Code Playgroud)

监听器:

public class TableListener extends AbstractMongoEventListener<Table> {

    private static final Logger logger …
Run Code Online (Sandbox Code Playgroud)

spring mongodb spring-data spring-data-mongodb

9
推荐指数
1
解决办法
6452
查看次数

在mongo集合上使用时,Spring数据版本注释不会递增

我正在使用带有mongodb的spring数据来存储二进制数据,例如图像等.我想维护一个版本字段以附加到url,以便从缓存图像中欺骗浏览器.

请参阅下面的文档基类:

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.mongodb.core.index.Indexed;

public abstract class BaseDocument {

    @Id
    @Indexed(unique=true)
    protected long id;
    protected byte[] data;
    protected String mimeType;
    protected String filename;
    protected String extension;
    @Version
    private Long version;
Run Code Online (Sandbox Code Playgroud)

我还有一个包装MongoOperations的存储库来保存我的文档.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class DocumentRepository implements IDocumentRepository {

    @Autowired
    private MongoOperations mongoTemplate;

    @Override
    public <D extends BaseDocument> void saveDocument(D document) {
        mongoTemplate.save(document);
    }
Run Code Online (Sandbox Code Playgroud)

为了实现版本控制,我做了一些狩猎,发现有一个@Version注释为spring mongo,但是已被弃用.然后我发现应该使用spring数据@Version注释.所以我继续使用弹簧数据@Version注释.

我期望发生的是每次保存文档时我的版本字段都会增加.我多次覆盖同一个文档,但我的版本字段并没有像我期望的那样增加.

我做错了什么或者我还需要做些什么吗?

java versioning spring-data spring-data-mongodb

9
推荐指数
1
解决办法
4814
查看次数

Spring注释@ModelAttribute和@Valid

使用@ModelAttribute和有@Valid什么好处?

哪些是差异?

可以一起使用它们吗?

spring spring-mvc spring-annotations spring-data

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

如何从JdbcTemplate获取受影响的行数?

我正在使用spring JdbcTemplate来执行sql查询:

JdbcTemplate template = new JdbcTemplate(ds);
template.execute(sqlInsert); //returns void
Run Code Online (Sandbox Code Playgroud)

我怎么能得到受影响的行数,因为该execute()方法返回void?

java spring spring-data

9
推荐指数
2
解决办法
8123
查看次数

如何在spring-data中强制加载CrudRepository?

我有一个包含一个实体List,其由此lazy通过默认加载:

interface MyEntityRepository extends CrudRepository<MyEntity, Long> {

}

@Entity
public class MyEntity {
    @Id
    private Long id;

    @OneToMany(mappedBy = "bar") //lazy by default
    private List<Bar> bars;
}

@Entity
public class Bar {
    //some more
}
Run Code Online (Sandbox Code Playgroud)

问题:如何在执行时强制执行加载repository.findOne(id)?

java spring hibernate spring-data

9
推荐指数
2
解决办法
6638
查看次数

Spring Boot测试中的MockBean注释导致NoUniqueBeanDefinitionException

我在使用@MockBean注释时遇到问题.文档说MockBean可以替换上下文中的bean,但是我在单元测试中得到NoUniqueBeanDefinitionException.我看不出如何使用注释.如果我可以模拟repo,那么很明显会有多个bean定义.

我正在按照此处的示例进行操作:https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4

我有一个mongo存储库:

public interface MyMongoRepository extends MongoRepository<MyDTO, String>
{
   MyDTO findById(String id);
}
Run Code Online (Sandbox Code Playgroud)

泽西岛资源:

@Component
@Path("/createMatch")
public class Create
{
    @Context
    UriInfo uriInfo;

    @Autowired
    private MyMongoRepository repository;

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public Response createMatch(@Context HttpServletResponse response)
    {
        MyDTO match = new MyDTO();
        match = repository.save(match);
        URI matchUri = uriInfo.getBaseUriBuilder().path(String.format("/%s/details", match.getId())).build();

        return Response.created(matchUri)
                .entity(new MyResponseEntity(Response.Status.CREATED, match, "Match created: " + matchUri))
                .build();
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个JUnit测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMocks {

    @Autowired
    private TestRestTemplate restTemplate;

    @MockBean
    private MyMongoRepository mockRepo; …
Run Code Online (Sandbox Code Playgroud)

java mockito mongodb spring-data spring-boot

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

使用Spring Data时,如何注册自定义Hibernate 5数据类型(BasicType)?

我使用Spring Data并决定创建可以在Hibernate实体中使用的新自定义数据类型.我检查了文档,BasicType并根据此官方用户指南选择并实施它.

我希望能够在其类名下注册该类型,并且能够在实体中使用新类型而无需@Type注释.不幸的是,我无法引用MetadataBuilder或Hibernate配置来注册新类型.有没有办法在Spring Data中获取它?似乎Hibernate的初始化对用户是隐藏的,并且不能轻易访问.我们使用以下类来初始化JPA:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactory",
        transactionManagerRef = "transactionManager",
        basePackages = {
                "..." // omitted
        }
)
public class JpaConfiguration implements TransactionManagementConfigurer {

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean configureEntityManagerFactory(
        DataSource dataSource,
        SchemaPerTenantConnectionProviderImpl provider) {

        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setPersistenceUnitName("defaultPersistenceUnit");
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setPackagesToScan(
                "..." // omitted
        );
        entityManagerFactoryBean.setJpaProperties(properties(provider));
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        return entityManagerFactoryBean;
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new JpaTransactionManager();
    }

    private Properties properties(SchemaPerTenantConnectionProviderImpl …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate hibernate-mapping spring-data

9
推荐指数
4
解决办法
4322
查看次数

JPA规范示例

Spring Boot在这里。我想换我的头周围JpaRepositories,并Specifications在执行复杂查询的上下文中使用,当我在努力“通过舍本逐末”的几个项目看。

a的一个典型示例Specification如下:

public class PersonSpecification implements Specification<Person> {
    private Person filter;

    public PersonSpecification(Person filter) {
        super();
        this.filter = filter;
    }

    public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> cq,
            CriteriaBuilder cb) {
        Predicate p = cb.disjunction();

        if (filter.getName() != null) {
            p.getExpressions()
                    .add(cb.equal(root.get("name"), filter.getName()));
        }

        if (filter.getSurname() != null && filter.getAge() != null) {
            p.getExpressions().add(
                    cb.and(cb.equal(root.get("surname"), filter.getSurname()),
                            cb.equal(root.get("age"), filter.getAge())));
        }

        return p;
    }
}
Run Code Online (Sandbox Code Playgroud)

在此toPredicate(...)方法中,Root<Person>和CriteriaQuery代表什么?最重要的是,听起来您需要为要应用的每种过滤器类型创建一个Specification …

spring-data spring-data-jpa spring-boot jpa-criteria

9
推荐指数
2
解决办法
8540
查看次数