As a database guy, I like to have as much data integrity managed by the database engine. This means constraints, focused data types, triggers, stored procedures, etc. in the database.
Now, that is not to say that it is wrong to move data integrity into a data access layer of an application. In fact, it is often the point of having a data access layer is to make an application relatively independant of the database technology being used. So, if you want to support a wide array of database engines, you need to manage this type of logic in an application layer.
This can be done correctly, and well. It can also be done poorly. If you are not finding orphaned records and invalid data in your database, I would not be extremely concerned that the foreign key constraints are being managed in the application.