我正在使用Hibernate,我有一个进程/最佳实践的问题。例如,假设我们有两个实体Truck和Wheel。控制盘具有两个属性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个属性,那么它就会变得非常多余。我想知道别人是如何解决这个问题的。
谢谢
发布于 2011-02-04 23:01:38
这正是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);
}另请参阅:
发布于 2011-02-04 22:28:54
我在应用程序的用户界面部分解决了这类问题。我有一个组件来显示值对象,例如轮子,如果用户在现有的轮子中找不到请求的轮子,用户可以通过该组件创建一个新的轮子。
发布于 2011-02-04 22:42:38
我会通过将GUI从后端分离出来来实现这一点。
图形用户界面将使用一个几乎是卡车对象的TruckDTO,但它包含一个WeelManufactuer字符串,而不是Weel。
图形用户界面控制器接收TruckDTO并将其转发给某个服务。这项服务,在数据库中与制造商联系。如果没有这样的weel,它就会创建它。然后,它使用weel (新的或现有的)和TruckDTO来创建卡车对象。
更新卡车也是如此。(当然,您必须更改它,而不是创建一个新的卡车)。
我将处理该问题的逻辑放在应用程序的服务部分,而不是接口部分。因为任何GUI实现都不会忘记实现正确的处理。
https://stackoverflow.com/questions/4898966
复制相似问题