I have two tables: tblCustomer
, tblProduct
:
tblCustomer:
Id: Integer, auto-increament
Name: Varchar(30)
....
tblProduct
Id: Integer, auto-increament
Name: Varchar(50)
customerId: Integer
....
And two classes: Customer
, Product
:
public class Product
{
private int id;
private int name;
/* Other stuffs */
}
public class Customer
{
private int id;
private String name;
private String phoneNumber;
/* get-set and others stuffs */
public static boolean add(Customer cus) {
/* This is for insert a customer to tblCustomer */
}
public boolean addProduct(Product pd) {
/* This is for insert a product to tblProduct with current customer Id */
}
}
When customer register account, it call:
Customer cus = new Customer(/* ... */);
Customer.add(cus);
and when customer buy a product:
Product pd = new Product(/* ... */);
currentCustomer.addProduct(pd);
But my teacher said it not correct in OOAD (and even OOP) because Customer.addProduct
is operate on tblProduct
table, is it right? What is good design for this case?
** Update: **
Product haven't a pre-defined yet, when a customer buy a product, the store will make it and delivery to customer, so two same products is rare happen, so is tblCustomerProduct
need?
Add a DAO tier that will contain the logical part of the methods save
, delete
, update
, etc.
Here is how I usually do:
basepackage.domain
: contains all your entities (data only, no logical part - in your case Product
and Customer
)basepackage.dao
: contains all your DAOs, only used to access the data, basically one per entity, each one containing methods such as findAll() : List<E>
, findOne(K id) : E
, save(E e) : void
, etc.basepackage.service
: contains all your services, the logical part of the app. The services are the only ones that are calling the DAOs.basepackage.presentation
(or basepackage.web
for a webapp): contains the HMI/web services/... implementation.