Would be nice to use model classes which implement a BuyableInterface instead of relying on concrete classes and mapped attributes.
interface BuyableInterface {
function getBuyableId();
function getBuyableName();
....
}
A BuyableRepository which implements a BuyableRepositoryInterface will be used to retrive items from any kind of storage system.
interface BuyableRepositoryInterface {
function findByBuyableId();
....
}