gpt4 book ai didi

java - 分层所有权导致请求缓慢

转载 作者:行者123 更新时间:2023-12-01 13:50:22 26 4
gpt4 key购买 nike

我有一些属于不同魔法教派的巫师。成为某个教派的成员会赋予你特殊的力量,你可以用它来打击你的敌人。其中一些教派有子教派,可以授予您额外的权力。

@Entity
public class Sect {
private long id;
private String name;
private Sect parent;
@ManyToMany
private Set<Spell> spells;
}

@Entity
public class Wizard {
private long id;
private String name;
@ManyToMany
private Set<Sect> sects;
}

现在,我有一位巫师,他是橡树骑士团的成员。橡树骑士团是森林骑士团的一个分支,而森林骑士团又是大地骑士团的一个分支。 (所以wizard.sects.contains(oak) == true,并且oak.parent.parent.equals(earth) == true)。法术“大地之箭”是由大地教团授予的。我的巫师并不是大地教团的明确成员,甚至也不是森林教团的成员。他被橡树骑士团的一名成员招募。然而,他隐含地是一名成员,并且可以使用所有这些法术。现在,我基本上是这样做的:

boolean canCast(Wizard wizard, Spell spell) {
Queue<Sect> toProcess = new ...
toProcess.addAll(wizard.getSects());
Set<Sect> processed = new ...
while(!toProcess.isEmpty()) {
Sect sect = toProcess.poll();
if(!processed.add(sect)) continue; // already did this from a sister sect
toProcess.add(sect.getParent());
if(sect.getSpells().contains(spell))
return true;
}
return false;
}

但当我真的不需要时,将所有这些信息拉回来似乎很愚蠢。

我知道我有几个选择,比如保留你的父订单表,所以当你被添加到橡树勋章时,它会将你添加到森林勋章和地球勋章,但这看起来很奇怪。如果你从橡树骑士团中除名,森林和地球也会被删除……如果你也是枫树骑士团的一员怎么办?你仍然会在森林和地球中。这只是一种情况 - 我确信在很多情况下这都会在我脸上爆炸。

另一种选择是跟踪来自地球和森林的咒语并将它们放入橡树和枫树中。但是,如果橡树明确提供了地球上也存在的咒语呢?如果我把它从地球教学中删除,它就不应该从橡树中删除。所以我真的会在 Spell 类上引用宗派,然后将它们全部添加到宗派和子宗派中。但这似乎也需要大量维护并且容易出错。

另一种选择是保留整个法术提供结构的缓存,每当提供中发生变化时,只需清空表并重建它即可。当我编辑法术时,这将是一项昂贵的操作,但这种情况相当罕见。

理想情况下,我有一个 HQL(我想我可以执行 NamedNative...但如果可以的话希望避免)运行并获取我需要的信息的查询。但我不知道如何构造这样的查询,如果我这样做了,如何使它不完全糟糕。

还有什么我没有想到的选择吗?有什么工具或者技巧吗?我知道hibernate有很多技巧!

最佳答案

编写Sect时,添加一个方法

isSubsectOf(Sect s)

如果该教派是其他教派的子教派,则返回 true。它是递归的,因此它返回当前的教派、祖 parent 教派等。现在您可以通过

检查巫师是否是某个教派的成员
  • 测试他是否是该教派的直接成员
  • 测试他所属的教派是否属于该教派

为了完整起见,您可能还想编写一些内容来列出给定教派的所有父教派等。

要检查某个能力,请在宗派“canCast(Spell sp)”上编写一个方法,该方法不仅检查该能力是否在该宗派的法术列表中,而且还检查所有父宗派的法术列表。如果 canCast(Spell sp) 对于他所属的教派返回 true,则巫师可以施展法术。

这是简单的 Java 继承,不需要任何复杂的东西

关于java - 分层所有权导致请求缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20008900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com