DAO 持久化:只有一种方法来存储复杂的数据对象?
DAO persistence: only one method to store a complex data object?
这里有:
public final class Product {
Integer productId;
String description;
...
public Product(final Integer productId, final String descripcion, ...) {
this.product_id = productId;
this.description = description;
...
}
public Integer getProductId() { ... }
public String getDescription() {...}
...
}
然后:
public final ProductDetails {
Integer productId;
String serialNumber;
...
public ProductDatails(final Integer productId, final serialNumber, ...){ ... }
public Intger getProductId() { ... }
public String getSerialNumber { ... }
...
}
因此,为了构建一个持久化两个 类 包含的数据的 DAO,问题是如果按以下方式做是一个好的做法:
public Interface IProductDAO {
public void saveProduct(final Product product);
public void saveProductDetails(final ProductDetails productDetails);
}
或:
public Interface IProductDAO {
public void saveProduct(final Product product, final ProductDetails productDetails);
我一直在考虑将两个类重构为一个如下:
public final class Product {
Integer productId;
String description;
ProductDetails productDetails;
...
public Product(final productId productId, final String description, final ProductDetails productDetails,...) {
if(productId!=productDetails.getProductId())
throw new IllegalArgumentException("ProductID is not the same");
...
}
}
所以:
public Interface IProductDAO {
public void saveProduct(final Product product);
}
我想知道哪一个是最 'natural' 根据最佳软件开发实践的方法。如果还有其他方法,也欢迎。
最好的方法是你有两个 java classes。一个是产品,第二个是 ProductDetails,您可以在其中了解产品的更多详细信息。当用户点击产品时,您可以获取此 class 以显示该特定项目的更多详细信息。
因此,需要在搜索页面中显示的最基本的详细信息可以包含在产品中 class。
class Product {
Integer productId;
String description;
@OneToOne
@Basic(Fetch = FetchType.LAZY)
ProductDetails details;
public Product(final Integer productId, final String descripcion, ...) {
this.product_id = productId;
this.description = description;
...
}
public Integer getProductId() { ... }
public String getDescription() {...}
...
}
class ProductDetails{
Integer productId;//any Id
String description;
//Storing a HD picture and other getters and setters
}
//details of the class
}
根据 Bertrand Meyer - Object Oriented Software Construction (2Ed)
,class 产品应包含对 ProductDetails 的引用,因为这些 class 之间存在密切关系。
另一方面,从 Product class 扩展以生成新的 ProductDetails class 是一种很好的做法。在这两种情况下,DAO 应如下所示:
public void saveProduct(final Product product);
这里有:
public final class Product {
Integer productId;
String description;
...
public Product(final Integer productId, final String descripcion, ...) {
this.product_id = productId;
this.description = description;
...
}
public Integer getProductId() { ... }
public String getDescription() {...}
...
}
然后:
public final ProductDetails {
Integer productId;
String serialNumber;
...
public ProductDatails(final Integer productId, final serialNumber, ...){ ... }
public Intger getProductId() { ... }
public String getSerialNumber { ... }
...
}
因此,为了构建一个持久化两个 类 包含的数据的 DAO,问题是如果按以下方式做是一个好的做法:
public Interface IProductDAO {
public void saveProduct(final Product product);
public void saveProductDetails(final ProductDetails productDetails);
}
或:
public Interface IProductDAO {
public void saveProduct(final Product product, final ProductDetails productDetails);
我一直在考虑将两个类重构为一个如下:
public final class Product {
Integer productId;
String description;
ProductDetails productDetails;
...
public Product(final productId productId, final String description, final ProductDetails productDetails,...) {
if(productId!=productDetails.getProductId())
throw new IllegalArgumentException("ProductID is not the same");
...
}
}
所以:
public Interface IProductDAO {
public void saveProduct(final Product product);
}
我想知道哪一个是最 'natural' 根据最佳软件开发实践的方法。如果还有其他方法,也欢迎。
最好的方法是你有两个 java classes。一个是产品,第二个是 ProductDetails,您可以在其中了解产品的更多详细信息。当用户点击产品时,您可以获取此 class 以显示该特定项目的更多详细信息。
因此,需要在搜索页面中显示的最基本的详细信息可以包含在产品中 class。
class Product {
Integer productId;
String description;
@OneToOne
@Basic(Fetch = FetchType.LAZY)
ProductDetails details;
public Product(final Integer productId, final String descripcion, ...) {
this.product_id = productId;
this.description = description;
...
}
public Integer getProductId() { ... }
public String getDescription() {...}
...
}
class ProductDetails{
Integer productId;//any Id
String description;
//Storing a HD picture and other getters and setters
}
//details of the class
}
根据 Bertrand Meyer - Object Oriented Software Construction (2Ed)
,class 产品应包含对 ProductDetails 的引用,因为这些 class 之间存在密切关系。
另一方面,从 Product class 扩展以生成新的 ProductDetails class 是一种很好的做法。在这两种情况下,DAO 应如下所示:
public void saveProduct(final Product product);