首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用hibernate的服务的最佳实践

使用hibernate的服务的最佳实践
EN

Stack Overflow用户
提问于 2011-02-04 22:16:28
回答 3查看 667关注 0票数 2

我正在使用Hibernate,我有一个进程/最佳实践的问题。例如,假设我们有两个实体Truck和Wheel。控制盘具有两个属性wheelid和wheelmanufacturer。因此,在我的应用程序中,用户可以创建一辆卡车,他们可以选择数据库中存在的各种车轮或创建自己的车轮。

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

代码语言:javascript
复制
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个属性,那么它就会变得非常多余。我想知道别人是如何解决这个问题的。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-04 23:01:38

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

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

代码语言:javascript
复制
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合并为一个整体:

代码语言:javascript
复制
public Truck saveTruck( Truck truck ) {
    return session.merge(truck);
}

另请参阅:

  • 11.7. Automatic state detection
  • 11.11. Transitive persistence
票数 1
EN

Stack Overflow用户

发布于 2011-02-04 22:28:54

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

票数 1
EN

Stack Overflow用户

发布于 2011-02-04 22:42:38

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

图形用户界面将使用一个几乎是卡车对象的TruckDTO,但它包含一个WeelManufactuer字符串,而不是Weel。

图形用户界面控制器接收TruckDTO并将其转发给某个服务。这项服务,在数据库中与制造商联系。如果没有这样的weel,它就会创建它。然后,它使用weel (新的或现有的)和TruckDTO来创建卡车对象。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4898966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档