这是很有可能的!我可能迟到了。但这肯定会在将来对某人有所帮助。这是一个完整的解决方案,就像一个魅力!
为您的实体创建BaseEntity
类,如下所示:
@MappedSuperclass
public class AbstractBaseEntity implements Serializable{
@Id @GeneratedValue
private Long id;
@Version
private int version;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public AbstractBaseEntity() {
this.createdAt = LocalDateTime.now();
this.updatedAt = LocalDateTime.now();
}
// getters and setters
}
为您的 DAO 持久性创建一个通用 JPA 存储库接口,如下所示:注意。请记住放置,@NoRepositoryBean
以便 JPA 不会尝试为存储库查找实现!
@NoRepositoryBean
public interface AbstractBaseRepository<T extends AbstractBaseEntity, ID extends Serializable>
extends JpaRepository<T, ID>{
}
创建一个使用上述基本 JPA 存储库的基本服务类。这是您域中的其他服务接口将简单扩展的接口,如下所示:
public interface AbstractBaseService<T extends AbstractBaseEntity, ID extends Serializable>{
public abstract T save(T entity);
public abstract List<T> findAll(); // you might want a generic Collection if u prefer
public abstract Optional<T> findById(ID entityId);
public abstract T update(T entity);
public abstract T updateById(T entity, ID entityId);
public abstract void delete(T entity);
public abstract void deleteById(ID entityId);
// other methods u might need to be generic
}
然后为基本 JPA 存储库创建一个抽象实现,并且还将提供基本 CRUD 方法的实现,如下所示:
@Service
@Transactional
public abstract class AbstractBaseRepositoryImpl<T extends AbstractBaseEntity, ID extends Serializable>
implements AbstractBaseService<T, ID>{
private AbstractBaseRepository<T, ID> abstractBaseRepository;
@Autowired
public AbstractBaseRepositoryImpl(AbstractBaseRepository<T, ID> abstractBaseRepository) {
this.abstractBaseRepository = abstractBaseRepository;
}
@Override
public T save(T entity) {
return (T) abstractBaseRepository.save(entity);
}
@Override
public List<T> findAll() {
return abstractBaseRepository.findAll();
}
@Override
public Optional<T> findById(ID entityId) {
return abstractBaseRepository.findById(entityId);
}
@Override
public T update(T entity) {
return (T) abstractBaseRepository.save(entity);
}
@Override
public T updateById(T entity, ID entityId) {
Optional<T> optional = abstractBaseRepository.findById(entityId);
if(optional.isPresent()){
return (T) abstractBaseRepository.save(entity);
}else{
return null;
}
}
@Override
public void delete(T entity) {
abstractBaseRepository.delete(entity);
}
@Override
public void deleteById(ID entityId) {
abstractBaseRepository.deleteById(entityId);
}
}
如何使用上述摘要entity
、、、service
和repository
:implementation
这里的示例将是一个MyDomain
实体。创建一个扩展AbstractBaseEntity
如下的域实体:NB。ID
, createdAt
, updatedAt
,version
等将自动包含在MyDomain
实体中AbstractBaseEntity
@Entity
public class MyDomain extends AbstractBaseEntity{
private String attribute1;
private String attribute2;
// getters and setters
}
然后为扩展如下repository
的MyDomain
实体创建一个:AbstractBaseRepository
@Repository
public interface MyDomainRepository extends AbstractBaseRepository<MyDomain, Long>{
}
另外,为实体创建一个service
接口,MyDomain
如下所示:
public interface MyDomainService extends AbstractBaseService<MyDomain, Long>{
}
然后为MyDomain
扩展实现的实体提供一个实现AbstractBaseRepositoryImpl
,如下所示:
@Service
@Transactional
public class MyDomainServiceImpl extends AbstractBaseRepositoryImpl<MyDomain, Long>
implements MyDomainService{
private MyDomainRepository myDomainRepository;
public MyDomainServiceImpl(MyDomainRepository myDomainRepository) {
super(myDomainRepository);
}
// other specialized methods from the MyDomainService interface
}
Now use your `MyDomainService` service in your controller as follows:
@RestController // or @Controller
@CrossOrigin
@RequestMapping(value = "/")
public class MyDomainController {
private final MyDomainService myDomainService;
@Autowired
public MyDomainController(MyDomainService myDomainService) {
this.myDomainService = myDomainService;
}
@GetMapping
public List<MyDomain> getMyDomains(){
return myDomainService.findAll();
}
// other controller methods
}
注意。确保AbstractBaseRepository
使用注释,@NoRepositoryBean
这样JPA
就不会尝试找到 bean 的实现。也AbstractBaseServiceImpl
必须标记为抽象,否则 JPA 将尝试自动装配AbstractBaseRepository
导致 a 的类的构造函数中的所有子 daos,NoUniqueBeanDefinitionException
因为创建 bean 时将注入超过 1 个 daos(存储库)!现在您的service
,repository
和implementations
更可重用。我们都讨厌样板!
希望这可以帮助某人。