the primary key generate shouldn't be bound to insert. We'd better leave it to developer to decide when to generate primary id because sometimes we need it prior to insert. Just wrap UUID (an implementation) into a implementation of our primary key generator: interface PrimaryKey -> UUIDPrimaryKey.get. Thus we've abstract the implementation from design.