【发布时间】:2020-12-21 10:36:30
【问题描述】:
我在 2 个模型之间存在循环依赖关系,但从使用的角度来看,这不是真正的依赖关系。
- 建筑物归业主所有
- 租户住在大楼里
根据用户的类型,与建筑物的关系有所不同。
public enum UserType
{
TENANT,
OWNER
}
用户:
public class User extends Model
{
@ManyToOne
private Building building;
private UserType type;
}
建筑:
public class Building extends Model
{
@ManyToOne
private User owner;
}
它是否被认为是真正的循环依赖?我应该如何避免这种情况?
编辑:
我使用 Play Framework(使用 Guice)进行依赖注入,这也让我很头疼。代码可以编译,但没有运行。
public class BuildingRepository
{
@Inject
private UserRepository userRepository;
private final Finder<Long, Building> find = new Finder<>(Building.class);
public void save(Building building)
{
building.save();
}
public void update(Building building)
{
building.update();
}
public boolean delete(Building building)
{
// check if there is tenants in the building
if (userRepository.countByBuilding(building) > 0)
{
return false;
}
return building.delete();
}
public List<Building> findFor(User user)
{
if (user.getType() == UserType.OWNER)
{
return find.query().where()
.eq("owner.id", user.getId())
.findList();
}
return new ArrayList<>();
}
}
UserRepository 使用BuildingRepository,但仅适用于特定类型的用户。
public class UserRepository
{
@Inject
private BuildingRepository buildingRepository;
private final Finder<Long, User> find = new Finder<>(User.class);
public void save(User user)
{
user.save();
}
public void update(User user)
{
user.update();
}
public boolean delete(User user)
{
if (user.getType() == UserType.OWNER)
{
// remove the owner on the buildings
for (Building building : buildingRepository.findFor(user))
{
if (user.equals(building.getOwner()))
{
building.setOwner(null);
buildingRepository.update(building);
}
}
}
return user.delete();
}
public int countByBuilding(Building building)
{
return find.query().where()
.eq("building.id", building.getId())
.eq("status", true)
.findCount();
}
}
【问题讨论】:
-
什么是“真正的”循环依赖?为什么要避免它?模块之间的循环依赖可能是有问题的,但我猜,同一个模块中的类之间这样的循环依赖是可以的。
-
一个“真正的”循环依赖不起作用,你不能在没有另一个的情况下创建一个,反之亦然。就我而言,如果用户类型正确,它就可以工作。我想避免它,因为我的框架抱怨它。它无法编译。
-
你把这些类放在不同的罐子里了吗?是的,然后它不会编译。你为什么把它们放在不同的罐子里?您是否打算将一个与另一个分开重复使用?
-
不,它们在同一个包中。我计划在 Angular 中使用前端,但它也抱怨它(作为警告)。另一件事是我使用依赖注入(使用 Play 框架),它使得无法编译。
-
啊,可能是在JSON序列化中。让我制定一个答案。
标签: java mysql jpa playframework