I'm hardly the local database pundit, but I've always adhered to the principal that a business field should never be used as a primary key. You'd think that something like an employee ID would be safe to use, but what if (just as with social security numbers) they decide to start re-using them?
For primary keys I always use a Long value that has no meaning other than to serve as a primary key.
OK, maybe I should make it clear what exactly I am trying to do.
I am writing a Swing framework that edits an entity object. It works in two modes: creating new object, and editing an existing one. If it's creating a new object, and user enters an id that already exists in the database, the framework is to fail gracefully (i.e. tell the user that an object with this id already exists, please choose another id).
Unfortunately, it fails with a ConstraintViolationException, and, short of parsing the exception, it's impossible (as far as I can tell) to know whether a primary key or somethiing else has been violated.
If I do a Session.merge(), it will save to the database. I can always rollback that save (although undesirable); however, once it saved, how do I know whether a record already existed before merge?