赞
踩
JPA 的目标之一是制定一个可以由很多供应商实现的API,并且开发人员可以编码来实现该API,而不是使用私有供应商特有的API。因此开发人员只需使用供应商特有的API来获得JPA规范没有解决但应用程序中需要的功能。尽可能地使用JPA API,但是当需要供应商公开但是规范中没有提供的功能时,则使用供应商特有的API。
package com.programb; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import com.programb.common.SimpleJpaRepositoryImpl; @EnableJpaRepositories(value = "com.programb.repository", repositoryBaseClass = SimpleJpaRepositoryImpl.class) @SpringBootApplication public class JpaApplication { public static void main(String[] args) { SpringApplication.run(JpaApplication.class, args); } }
package com.programb.common; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.support.JpaEntityInformation; import org.springframework.data.jpa.repository.support.SimpleJpaRepository; import org.springframework.util.StringUtils; import javax.persistence.EntityManager; import javax.transaction.Transactional; import java.beans.PropertyDescriptor; import java.util.HashSet; import java.util.Optional; import java.util.Set; import java.util.UUID; public class SimpleJpaRepositoryImpl<T, ID> extends SimpleJpaRepository<T, ID> { private final JpaEntityInformation<T, ?> entityInformation; private final EntityManager em; @Autowired public SimpleJpaRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) { super(entityInformation, entityManager); this.entityInformation = entityInformation; this.em = entityManager; } @Override @Transactional public <S extends T> S save(S entity) { //获取ID ID entityId = (ID) entityInformation.getId(entity); Optional<T> optionalT; if (StringUtils.isEmpty(entityId)) { String uuid = UUID.randomUUID().toString(); //防止UUID重复 if (findById((ID) uuid).isPresent()) { uuid = UUID.randomUUID().toString(); } //若ID为空 则设置为UUID new BeanWrapperImpl(entity).setPropertyValue(entityInformation.getIdAttribute().getName(), uuid); //标记为新增数据 optionalT = Optional.empty(); } else { //若ID非空 则查询最新数据 optionalT = findById(entityId); } //获取空属性并处理成null String[] nullProperties = getNullProperties(entity); //若根据ID查询结果为空 if (!optionalT.isPresent()) { em.persist(entity);//新增 return entity; } else { //1.获取最新对象 T target = optionalT.get(); //2.将非空属性覆盖到最新对象 BeanUtils.copyProperties(entity, target, nullProperties); //3.更新非空属性 em.merge(target); return entity; } } private static String[] getNullProperties(Object src) { //1.获取Bean BeanWrapper srcBean = new BeanWrapperImpl(src); //2.获取Bean的属性描述 PropertyDescriptor[] pds = srcBean.getPropertyDescriptors(); //3.获取Bean的空属性 Set<String> properties = new HashSet<>(); for (PropertyDescriptor propertyDescriptor : pds) { String propertyName = propertyDescriptor.getName(); Object propertyValue = srcBean.getPropertyValue(propertyName); if (StringUtils.isEmpty(propertyValue)) { srcBean.setPropertyValue(propertyName, null); properties.add(propertyName); } } return properties.toArray(new String[0]); } }
package com.programb.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.programb.entity.User; import com.programb.repository.UserRepository; import java.util.List; @RestController public class UserController { @Autowired private UserRepository userRepository; @RequestMapping("/") public List<User> get() { userRepository.save(new User("1", "", null)); return userRepository.findAll(); } }
package com.programb.entity; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import org.hibernate.annotations.GenericGenerator; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "T_USER") @JsonIgnoreProperties({"handler","hibernateLazyInitializer"}) public class User { @Id @GenericGenerator(name = "programb",strategy = "uuid") @GeneratedValue(generator = "programb") private String userId; private String username; private String password; public User() { } public User(String userId, String username, String password) { this.userId = userId; this.username = username; this.password = password; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "userId='" + userId + '\'' + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
package com.programb.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.programb.entity.User;
public interface UserRepository extends JpaRepository<User, String> {
}
spring:
datasource:
url: jdbc:mysql://localhost:3306/socks?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
drop table if exists t_user;
create table t_user (
user_id varchar(50),
username varchar(50),
password varchar(50)
);
insert into t_user values ('1', 'admin', 'admin');
insert into t_user values ('2', 'programb', '123456');
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.programb</groupId> <artifactId>springboot-data-jpa</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-data-jpa</name> <description>jpa</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。