【问题标题】:Best Practice with a service using hibernate使用休眠的服务的最佳实践
【发布时间】:2011-02-04 14:16:28
【问题描述】:

我正在使用 Hibernate,但遇到了流程/最佳实践问题。例如,假设我们有 2 个实体 Truck 和 Wheel。轮子有 2 个属性 wheelid 和 wheelmanufacturer。所以在我的应用程序中,用户可以创建一辆卡车,他们可以选择数据库中存在的各种车轮或创建自己的车轮。

我的问题是当我从前端收到一个卡车对象时,我如何确保如果轮子确实存在于数据库中,则使用 db 副本,如果它不存在于数据库中,它被添加。这是我的服务现在如何工作的基本示例

public Truck saveTruck( Truck truck )
{
     //Yes, this is a two-wheel truck =)
     Wheel frontWheel = truck.getFrontWheel();
     if( frontWheel != null && frontWheel.getWheelId() != null )
     {
         Wheel dbWheel = wheelDao.getWheelById( frontWheel.getWheelId() );
         if( dbWheel != null )
         {
              truck.setFrontWheel(dbWheel );
         }
     }
}

这样做的动机是我不希望用户能够覆盖数据库中的对象,但是他们需要能够编写自定义对象。上面的代码可以工作,但是如果你有一辆有 10 个属性的卡车,它就变得非常多余了。我想知道其他人是如何解决这个问题的。

谢谢

【问题讨论】:

    标签: java hibernate dao


    【解决方案1】:

    这正是merge() 操作所做的。

    也就是说,您的代码可以替换为以下内容:

    public Truck saveTruck( Truck truck ) {
        //Yes, this is a two-wheel truck =)
        Wheel frontWheel = truck.getFrontWheel();
        if( frontWheel != null) {
             truck.setFrontWheel(wheelDao.merge(dbWheel));         
        }
    }
    

    wheelDao.merge() 提供对Session.merge() 的访问权限。

    如果你的Truck有很多属性需要合并,你可以配置它们级联一个merge()操作,把Truck合并为一个整体:

    public Truck saveTruck( Truck truck ) {
        return session.merge(truck);
    }
    

    另请参阅:

    【讨论】:

    • 我认为解决方案会涉及合并。在stackoverflow提供的帮助之后,我想我只需要开拓进取。整个“保存”、“更新”、“合并”范式之间有很多细微差别,我觉得我能学会它的唯一方法就是受伤并让差异直击你的脸。
    【解决方案2】:

    我在应用程序的用户界面部分解决了这类问题。我有一个组件来显示值对象,例如轮子,如果用户无法从现有轮子中找到请求的轮子,用户可以通过该组件创建一个新轮子。

    【讨论】:

    • 非常聪明。我会牢记这一点,并且绝对会在我的应用程序中使用它。但是,我有一种讨厌的感觉,这个问题或类似物会抬起丑陋的脑袋。我现在想把野兽放下。
    【解决方案3】:

    我将通过将 GUI 与后端分离来实现这一点。

    GUI 将使用一个 TruckDTO,它几乎是 Truck 对象,但它不是 Weel,而是包含一个 WeelManufactuer 字符串。

    GUI 控制器接收 TruckDTO 并将其转发给某个服务。 该服务在数据库中与制造商一起寻找 Weel。如果没有这样的轮子,它就会创建它。然后它使用 weel(新的或现有的)和 TruckDTO 创建卡车对象。

    更新卡车也是如此。 (当然,您必须更改它,而不是创建新卡车)。

    我将处理该问题的逻辑放在应用程序的服务部分而不是接口部分。因为这样任何 GUI 实现都不会忘记实现正确的处理。

    【讨论】:

    • 看看 Truck 和 Weel 之间的删除孤儿“关系船”,它会帮助您删除未使用的 weels。 -- 但我不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多