- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些属于不同魔法教派的巫师。成为某个教派的成员会赋予你特殊的力量,你可以用它来打击你的敌人。其中一些教派有子教派,可以授予您额外的权力。
@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/
我正在使用 tcod-rs。用于绘制到 RootConsole 的每个方法都采用一个可变引用。中央循环是一个 while 循环,它等待窗口关闭、清除屏幕、绘制,然后刷新。 “检查窗口关闭”方法也采用可
我写了一个具有这种形式的函数: 结果 f(const IParameter& p); 我的意图是这个签名将明确表明函数没有取得参数 p 的所有权。 问题是 Result 将保留对 IParameter
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: What is a smart pointer and when should I use one? 我正在阅
假设我有一个类: class Scheduler { Scheduler(JobService *service); AddJob(JobID id, ISchedule *sched
我试图弄清楚所有权如何与函数 CVMetalTextureGetTexture 一起工作: CVMetalTextureRef textureRef; // ... textureRef is cre
这个问题在这里已经有了答案: Should we pass a shared_ptr by reference or by value? (10 个答案) 关闭 4 年前。 例如 class A {
我正在做一个附带项目,我需要根据他的 gmail 帐户或任何其他参数来验证 channel 是否属于某个用户……这基本上是为了避免假帐户。是否可以? 最佳答案 是的, 跟随 youtube 记录的链接
我在使用Core Foundation Array时发现了一个奇怪的问题!这是代码片段 fname = CFStringCreateWithFormat(kCFAllocatorDefault, NU
有没有一种方法可以设置在 apache 下运行的 php 来创建文件夹,该文件夹的文件夹属于创建它的程序的所有者,而不是由 apache 拥有? 使用 word press 它会创建要上传到的新文件夹
我编写了以下函数来使用 boost.date_time 获取日期/时间字符串. namespace bpt = boost::posix_time; string get_date_time_stri
我在使用 Docker 容器时遇到了一个有点烦人的问题(我在 Ubuntu 上,所以没有像 VMWare 或 b2d 这样的虚拟化)。我已经构建了我的镜像,并且有一个正在运行的容器,它有一个来 sel
根据大多数示例,逻辑上最少有 3 个组织 ( org1, org2, orderer )。 实际上只有 2 个物理组织 ( org1, org2 )。任一组织或约定的第 3 方必须移交订购者组织的职责
我开始学习 Rust,在进行实验时,我发现所有权如何应用于我不理解的元组和数组的方式有所不同。基本上,以下代码显示了差异: #![allow(unused_variables)] struct Inn
我们有一个应用程序,其表单上有许多组件(面板、选项卡、编辑、组合框等)。但根据用户配置文件,其中大多数可以自动填充和/或不可见。因此,用户可以更快地完成工作。 问题:是否有更简单的方法可以在运行时创建
我有以下代码片段: fn f u32>(c: T) { println!("Hello {}", c()); } fn main() { let mut x = 32; let
我想执行示例中的代码: require_once 'google-api-php-client/vendor/autoload.php'; $client = new Google_C
这个问题在这里已经有了答案: What is move semantics? (11 个答案) 关闭 3 年前。 我有一个看起来像这样的构造函数: Thing::Thing(std::vector
我们正在使用服务帐户从服务器上传文件,但它已达到其存储配额限制。所有文件都已添加到另一个用户(具有 100 Gb 存储配额的 @gmail.com 帐户)创建的文件夹下,但上传的所有文件均归该服务帐户
我正处于 this question 中描述的 sme 情况。 .那个提问者找到的解决方案是 Full access !== Owner. I need to read the documentati
我正处于 this question 中描述的 sme 情况。 .那个提问者找到的解决方案是 Full access !== Owner. I need to read the documentati
我是一名优秀的程序员,十分优秀!