0

我是 spring 和 hibernate 的新手,所以在你的回答中考虑到这一点。

我有一个多对多的关系,链接表也必须包含信息。我将尝试根据以下方法解决此问题:

如何为连接表中的其他属性创建多对多 Hibernate 映射?

我的问题与:

hibernate:插入/更新的自定义代码

但我只是在这里重复一遍,所以不需要点击链接:

假设我们有颜色。用户可以创建 n 种颜色的混合物并将该混合物存储在数据库中。稍后,如果用户搜索颜色“蓝色”,则应显示所有包含蓝色的混合物。

业务规则是任何颜色都只能在数据库中出现一次。因此,如果插入新的混合物,则必须首先检查所有颜色是否已在数据库中,如果是,则应重复使用(引用)该颜色,如果不是则应创建新颜色。

如果一个混合物被改变,说“蓝色”被“红色”取代,行为必须是最初的“蓝色”保持不变,系统检查“红色”是否存在,要么重用它,要么创建它,然后将它添加到混合物。

重要的部分是“颜色”由系统管理,现有颜色不得更改。“红色”将始终为“红色”,永远不应更改为“蓝色”。因为我是 Hibernate 和 Spring 的新手,所以我对如何实现这个规则以及在什么级别上有点迷茫。恕我直言,我会把这个逻辑放在可能的最低级别,这样如果你(开发人员)它就不会中断忘记检查它。那有意义吗?更好的想法或建议?

4

2 回答 2

0

如果我们可以使用相同的颜色和混合示例,它们可能看起来像这样:

public class Color {
  String name;
  List<Mixture> mixtures;
  public String getName() { return name; }
  ...    
}

public class Mixture {
  String name;
  List<Color> colors;
}

因此,我认为确保您的 Color 永远不会重命名的最简单方法是不提供 setter setName。确保您的颜色永远不会被删除变得有点棘手。但是,如果您要为持久性提供 DAO 方法,则不要提供deleteColor方法。

我不确定不能删除未使用的颜色(没有被任何混合物引用)是否是一个非常强烈的要求 - 这样做有什么好处?对于那些被引用的,数据库中会有参照完整性约束——或者至少应该有。

于 2012-10-04T10:33:11.660 回答
0

所以这里是我目前的解决方案:

  1. 颜色的唯一约束
  2. 在 DAO 更新方法中检查要更新的颜色是否已存在于数据库中。如果是则使用它,如果不是则创建一个新的
  3. 如果颜色的更改和更新发生在同一个休眠会话中,第 2 点就会出现问题。然后它会将颜色从红色更新为蓝色,因为在 2 中完成的查询将始终返回我们正在更新的颜色!我通过将 @Immutable 添加到 Color 实体类来解决这个问题。

代码为 2。

public Color update(final Color color) {
    SQLQuery query = this.getCurrentSession().createSQLQuery(
        "select * from colors where color = :color")
        .addEntity(Color.class);        
    query.setString("color", color.getColor());
    Color result = (Color) query.uniqueResult();
    if (result == null) {
        Color newColor = 
                new Color(color.getColor());
        this.getCurrentSession().persist(newColor);
        return newColor;
    } else {
        return (Color) this.getCurrentSession().merge(result);
    }
}
于 2012-10-09T18:09:42.393 回答