Java 什么';这是一个很好的数据库实体更新/删除服务设计
我需要指导来设计没有循环依赖关系和不必要的数据库更新的服务布局 假设我有一个包含两个实体的数据库,Java 什么';这是一个很好的数据库实体更新/删除服务设计,java,spring,service,Java,Spring,Service,我需要指导来设计没有循环依赖关系和不必要的数据库更新的服务布局 假设我有一个包含两个实体的数据库,工厂和产品。工厂有一个产品列表,每个产品都有一个工厂的参考 public class Factory { private String id; private List<String> productIds; } public class Product { private String id; private String factoryId; } 查
工厂
和产品
。工厂有一个产品列表,每个产品都有一个工厂的参考
public class Factory {
private String id;
private List<String> productIds;
}
public class Product {
private String id;
private String factoryId;
}
查找、创建、更新和删除的业务逻辑放在服务类中,每个实体一个。删除产品时,应将其从工厂列表中删除。删除工厂时,列表中的所有产品也应删除
public class FactoryService {
public boolean deleteFactory(Factory factory) {
// Bunch of other things happening
factory.getProductIds().forEach(productId -> {
productRepository.deleteProductWithId(productId);
});
}
public void removeProductFromFactory(Product product, Factory factory) {
factory.getProductIds().remove(product.getId());
factoryRepository.save(factory);
}
...
}
public class ProductService {
public boolean deleteProduct(Product product) {
// Bunch of other things happening
Factory factory = factoryService.findById(product.getFactoryId());
factoryService.removeProductFromFactory(product, factory);
productRepository.delete(product);
}
...
}
为了避免在删除产品时重复//发生的大量其他事情的代码,我想在这两个服务中重用代码。但是,正如您所看到的,当factoryService调用productService时,它会创建一个循环依赖项,而当工厂被删除时,productService又会调用factoryService。另一个问题是,删除工厂时,会对数据库进行不必要的更新。这是因为当删除每个产品时,产品删除方法会更新工厂。即使将新功能deleteAllProducts
添加到FactoryService
-类中,也至少会执行一次更新。由于工厂将被删除,这是一个不必要的操作
如果我要重做所有这些,什么是更好的设计?我错过了什么帮助班?我是否使用了错误的服务类?欢迎使用SO。我认为上述方法没有任何问题。但既然你问了,如果你要重做这一切,那就走纯JDBC路线吧。这将给你更多的控制和简单。但我想,每当我们必须做出选择时,我们都知道好的和不好的事情。我有没有提到我们可以比较苹果(JPA)和橙子(JDBC)?我会选择我觉得更美味的。只需将级联删除添加到您的数据库?欢迎使用SO。我认为上述方法没有任何问题。但既然你问了,如果你要重做这一切,那就走纯JDBC路线吧。这将给你更多的控制和简单。但我想,每当我们必须做出选择时,我们都知道好的和不好的事情。我有没有提到我们可以比较苹果(JPA)和橙子(JDBC)?我会选择我觉得更美味的。只需添加级联删除到您的数据库?
public class FactoryService {
public boolean deleteFactory(Factory factory) {
// Bunch of other things happening
factory.getProductIds().forEach(productId -> {
productRepository.deleteProductWithId(productId);
});
}
public void removeProductFromFactory(Product product, Factory factory) {
factory.getProductIds().remove(product.getId());
factoryRepository.save(factory);
}
...
}
public class ProductService {
public boolean deleteProduct(Product product) {
// Bunch of other things happening
Factory factory = factoryService.findById(product.getFactoryId());
factoryService.removeProductFromFactory(product, factory);
productRepository.delete(product);
}
...
}