I am currently using Hibernate Tools 3.1; I customized naming convention and DAO templates. The database (SQL Server 2005) in early development phase and I'm in charge of rebuilding the mappings, entities, DAOs, configuration, whatever. Each time I have to reverse-engineer the tables and so I lose every customization I made on the mappings (*.hbm.xml files) like adjusting the identity columns, picking the fields used in equals and toString. I was considering to write the diff XML in a file and the "merge" that onto the generated mapping (see my related question) but I was wondering... is there any best practice/tool for dealing with these annoying, unavoidable, critical tasks?
Hibernate Tools and the ever changing database
This is two and a half years late, but I'll offer a dissenting opinion. You should be able to make any customizations you need to the mapping files through the hibernate.reveng.xml file or a custom ReverseEngineeringStrategy. For the classes themselves, you should always generate to base classes and extend them with classes containing custom code.
For example, generate com.company.vo.generated.CustomerGenerated and extend it with com.company.vo.custom.Customer. Code generation should overwrite all classes in the generated package but never in the custom package (although you can have Hibernate Tools generate these custom classes in the target directory so that you can copy and paste blanks into the custom directory as needed). This way you can override methods for equals, toString, etc in the custom classes and not lose your changes when you regenerate. Also note that the best practice is to not check in generated code into SCM.
There are some great examples on this site of how to achieve this using Maven, the Hibernate3 plugin, and the build helper plugin. Most of these have very helpful answers by Pascal Thivent. This method is working beautifully for me, and while there is a bit of a learning curve it's a wonderful thing to be able to propagate database changes to the app with a single Maven command.
What type of application/utilization is YAML best suited for?
This is hard to clearly answer. Instead, I'll try provide some examples of what YAML isn't good for (in my humble opinion).
<name type="string">Orion</name> <age type="integer">26</age>
This is a case of where it is useful to mix both attributes and values in XML. YAML doesn't have attributes, so you have to use type inference to decide what's a date/integer/string/etc - this fails for complex or user-defined types.
<user> .... 10 lines of stuff <sub-user> ...15 more lines of stuff </sub-user> .... 10 more lines of stuff belonging to user </user>
This is a case where the closing tags in XML provide a lot of benefit. If you were to format the above data in YAML, using only indentation to provide 'scope', it would be a lot harder to tell where things start and end.
For good measure, here's a quote from the official yaml spec at yaml.org
YAML is primarily a data serialization language. XML was designed to be backwards compatible with the Standard Generalized Markup Language (SGML) and thus had many design constraints placed on it that YAML does not share. Inheriting SGML’s legacy, XML is designed to support structured documentation, where YAML is more closely targeted at data structures and messaging. Where XML is a pioneer in many domains, YAML is the result of lessons learned from XML and other technologies.
I just have the following line at the beginning of most of my classes.
private static final Logger log = LoggerFactory.getLogger(new Throwable().getStackTrace().getClassName());
yes there is some overhead the very first time an object of that class is created, but I work mostly in webapps, so adding microseconds onto a 20 second startup isn't really a problem.