如何在jdo中不再引用它时从数据库中删除对象? (n:1关系)

时间:2010-12-17 14:41:29

标签: java jdo datanucleus

我有“Character”类和“Faction”类。角色有一个派系。派系可以被许多角色使用。当角色被持久化时,派系会持久存在。当没有更多字符引用该派系时,我想将其从数据库中删除。

当我有1:1的关系时很容易因为我可以使用

@Persistent(dependent = "true")

在不再需要时删除它。但这已经不可能了,因为现在可能还有另一个角色仍然需要派系。因此,如果我尝试删除character1并且他使用与character2相同的派系,我会得到以下异常:

java.sql.SQLIntegrityConstraintViolationException: DELETE on table 'FACTION' caused a violation of foreign key constraint 'CHARACTER_FK1' for key (1).  The statement has been rolled back.

我只想在没有更多角色需要时删除该派系。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

它认为最好的解决方案将是数据库本身,而不是Java。你想在Character上放置一个ON DELETE触发器,它将获取当前记录(被删除的那个),查找它的'Faction,然后检查Character表中是否有引用同一个Faction的其他记录。如果存在引用该Faction的其他记录,则不执行任何操作。如果引用该Faction的其他记录不存在,请删除Faction。

如果您无法在数据库服务器上执行此操作,则可以轻松地在代码中执行与上面相同的操作。将其直接放在数据库上的好处是,无论您的用户与数据之间有多少个中间代码层,您都可以在一个地方定义规则,始终将被强制执行。< / p>