【问题标题】:How to remove object from database when it's not referenced anymore in jdo? (n:1 relationship)jdo中不再引用对象时如何从数据库中删除对象? (n:1 关系)
【发布时间】:2010-12-17 14:41:28
【问题描述】:

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

当我有一对一的关系时,这很容易,因为我可以使用

@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.

我只希望在不再需要该派系时删除该派系。我该怎么做?

【问题讨论】:

  • 是否可以将 "Character" 保留为 "Fraction" 的成员?您将在“分数”中获得“字符”列表。因此,您可能知道“分数”何时不再包含“字符”,然后将其删除。据我所知,您还可以毫无问题地删除“字符”。

标签: java jdo datanucleus


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多