我们正处于使用 gRPC 开发微服务的初期。我们的微服务旨在在 JVM 上运行。在我们的持久层中,我们想使用一个 ORM 库。Spring Data JPA 项目看起来很有前途。
但是有两个 spring-grpc-boot-starter 项目吗?
我应该使用哪一种?或者您推荐其他任何一种或方法吗?
我正在开发 Spring REST 服务(使用 Spring Data JPA),并且我的实体包含 java.util.UUID 类型的属性。我使用MySQL作为数据库,这会导致问题。到目前为止,除了 UUID 是查询一部分的存储库方法之外,一切都工作正常,例如: entityRepository.findByUuid(UUID uuid);
默认情况下,数据存储在二进制 (255) 列中。从存储库获取 UUID 工作正常,唯一的问题是在查询中使用 UUID,如 findByUuid() 中。它总是告诉我在数据库中找不到特定的 UUID。MariaDB 也会出现同样的问题。
我的服务与 H2-Database 一起正常工作。知道为什么 MySQL(和 MariaDB)有这个问题吗?
数据库配置:
spring.datasource.url=jdbc:mysql://localhost/abc123
spring.datasource.username=alfkmakfaf
spring.datasource.password=aafkmafmlaf
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
Run Code Online (Sandbox Code Playgroud)
实体中的 UUID
@Entity
public class Thema {
// without any annotations, works fine with H2 Database
private UUID uuid;
...
Run Code Online (Sandbox Code Playgroud) 我有以下几行代码:
@RequestMapping(value="/persons",method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<List<Person>> saveUsers(@RequestBody List<Person> persons) {
persons = (List<Person>) userRepository.save(persons);
return new ResponseEntity<List<Person>>(persons, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
这是存储库:
@Transactional
public interface UserRepository extends UserBaseRepository<User> {
}
@NoRepositoryBean
public interface UserBaseRepository<T extends User> extends CrudRepository<T, Long> {
public T findByEmail(String email);
}
Run Code Online (Sandbox Code Playgroud)
它运行正常.运行代码时,我看到以下日志.
Hibernate: insert into user (email, firstname, lastname, user_type) values (?, ?, ?, 'Person')
Hibernate: insert into user (email, firstname, lastname, user_type) values (?, ?, ?, 'Person')
Hibernate: insert into user (email, firstname, lastname, user_type) values …Run Code Online (Sandbox Code Playgroud) 我在Java Hibernate中有这个
@Query("SELECT dirPar FROM DirectiveParagraph dirPar, Directive dir "
+ "WHERE dirPar.directive = dir "
+ "AND dir.txtDirCode = :txtDirCode ");
List<DirectiveParagraph> getByName(@Param("txtDirCode") String name, @Param("page") int page ,@Param("size") int size);
Run Code Online (Sandbox Code Playgroud)
我想用限制和大小检索,就像这样
SELECT * FROM tblDirectiveParagraph where intDirectiveID = 1 limit 10,10;
Run Code Online (Sandbox Code Playgroud)
如何为上面的@Query注释添加限制
我在父类上有这个配置:
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "type",
visible = true
)
@JsonSubTypes({
@JsonSubTypes.Type(value = AnalysisViewer.class, name = "ANALYSIS"),
@JsonSubTypes.Type(value = CombinedAnalysisViewer.class, name = "COMBINED"),
@JsonSubTypes.Type(value = SingleSourceViewer.class, name = "SINGLESOURCE"),
@JsonSubTypes.Type(value = SingleSourceGroupViewer.class, name = "SINGLESOURCE_GROUP")
})
Run Code Online (Sandbox Code Playgroud)
并且该类具有以下type属性,我需要在数据库中保留(使用JPA).
public class Viewer {
...
@Column(name = "TP_VIEWER")
@Enumerated(EnumType.STRING)
private ViewerTypeEnum type;
...
}
Run Code Online (Sandbox Code Playgroud)
使用此配置或更改为visible=false,include=JsonTypeInfo.As.PROPERTY我要么在序列化时收到错误,说它不可能写两次相同的属性,或者说错误说我无法在type列中保存空值.
我需要的是在数据库中使用type属性并使用它来教杰克逊的子类型.我尝试了很多不同的配置,我找不到关于在反序列化时保留和填充属性的文档.有人可以帮助我吗?
提前致谢.
我的bean中有一个String列表.这些字符串是电子邮件,我想验证它们.
@Email
@ElementCollection(fetch = FetchType.LAZY)
@OrderColumn
private List<String> emails = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
在执行时,我收到此错误:
Caused by: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.util.List<java.lang.String>.
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.verifyResolveWasUnique(ConstraintValidatorManager.java:218)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.findMatchingValidatorClass(ConstraintValidatorManager.java:193)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.getInitializedValidator(ConstraintValidatorManager.java:97)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:125)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateComposingConstraints(ConstraintTree.java:233)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:102)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:91)
at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:83)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:547)
...
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?或者还有其他方法吗?
我有一个Java Spring应用程序。它确实提供了后端的东西,提供了Restful API,全部使用Oracle数据库。
对于大多数资源,它遵循典型的设计模式:“控制器>服务>存储库> DB”。
在存储库级别,扩展JpaRepository接口时,无需提供主体即可定义一组方法,如下所示:
public interface SurgeryRepository extends JpaRepository<Surgery, String> {
public List<Surgery> findByPracticeNameContainingIgnoreCase(String substring);
public Surgery findById(String id);
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是如何定义一个方法,该方法允许我使用ID列表检索多行,例如:
public List<Surgery> findByIDs(List<String> IDs);
Run Code Online (Sandbox Code Playgroud)
应该自动映射到这种SQL的东西
SELECT * FROM SURGERIES WHERE SURGERY_ID IN ('101',102,103',104',105',106')
Run Code Online (Sandbox Code Playgroud)
...但不必在Java代码中编写本机查询。(不一定是id,它可以是任何字段)预先感谢。
如果不存在,是否有任何方法可以插入新记录并在不丢失旧数据的情况下更新记录?
这是我的服务层方法:
public void saveSample(Sample sample) {
Sample samplePersistent = sample;
if (sample.getId() != null) {
samplePersistent = sampleRepository.findOne(sample.getId());
Assert.notNull(samplePersistent, "Sample entity not found with id : " + sample.getId());
samplePersistent.setLocation(sample.getLocation());
samplePersistent.setName(sample.getName());
samplePersistent.setType(sample.getType());
...
...
}
samplePersistent.cloneAuditingInfoFrom(sample);
sampleRepository.save(sample);
}
Run Code Online (Sandbox Code Playgroud)
我认为这是无用的方式.
Spring BeanUtils Class或@DynamicUpdate Annotation可以解决我的问题吗?
每次进入服务类时,存储库似乎都不会自动装配,因为它会不断抛出NullPointerException。谁能帮我检查我想念的是什么?
这是我的代码:
DemoApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.orm.jpa.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Configuration
@EnableAutoConfiguration
@ComponentScan({"com.example", "com.controller", "com.repositories", "com.service", "com.model"})
@EntityScan(basePackages = {"com.model"})
@EnableJpaRepositories(basePackages = {"com.repositories"})
@EnableTransactionManagement
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
人.java
package com.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
long id;
String firstName;
String lastName;
public …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的实体:
@Entity
@Table(name = "transaction_receiver")
public class TransactionReceiver implements Serializable, Addressable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
@Column(name = "contact_id", nullable = false)
private String contactId;
@Column(name = "datev_number")
private String datevNumber;
@NotNull
@Column(name = "receiver", nullable = false)
private String receiver;
@NotNull
@Size(min = 22, max = 34)
@Column(name = "iban", length = 34, nullable = false)
private String iban;
@Size(min = 8, max = 11)
@Column(name = "bic", …Run Code Online (Sandbox Code Playgroud) java ×8
spring ×7
hibernate ×5
spring-boot ×4
mysql ×2
spring-data ×2
database ×1
grpc ×1
grpc-java ×1
jackson ×1
jdbc ×1
json ×1
spring-mvc ×1
validation ×1