Create an Entity

In this section you will create your very first entity using AndroMDA. Since people are central to TimeTracker, we will start out by modeling a Person entity. Person has three attributes: username, firstName and lastName. The model for the Person entity is shown below.

Note that we have marked the Person class with a stereotype of Entity. This tells AndroMDA that Person is an Entity as opposed to other type of model elements such as Enumeration or EmbeddedValue. Stereotypes determine what pattern of code AndroMDA will generate for a model element. More specifically, they determine which AndroMDA code generation templates will be triggered.

Note that we have marked all three attributes to be of type String. This type should not be confused with the Java type java.lang.String. In model driven architecture, the model is kept independent of technology and hence all model elements are defined in terms of platform independent types. So String in this context is a platform independent type. When we run AndroMDA to generate code, it will translate platform independent types into platform dependent types such as java.lang.String. If we were to use the same model to generate a .NET application, AndroMDA will translate String into System.String, which is the .NET equivalent of java.lang.String. As you can see, a key advantage of the model driven approach is that your investment in the business models is preserved even as technologies come and go.

Now let us enter the Person entity in the empty model that was created by the AndroMDA application plugin. If you remember, this model was created at timetracker/mda/src/uml/TimeTrackerModel.xmi. Please follow one of the links below to edit the model with the UML tool of your choice.

ArgoUML MagicDraw

Generate Code

Follow the steps below to generate code.

  1. Open a Command Prompt and change your directory to C:/timetracker.
  2. Execute the command maven -o install. As mentioned earlier, the -o option instructs maven to run in "offline" mode, using the libraries in the local repository. This allows the build to run much faster. Make sure you get a BUILD SUCCESSFUL message when Maven finishes execution.

Open the folder C:/timetracker/core/target/src/org/andromda/timetracker/domain in Windows Explorer. Note that there are 6 files generated in this folder as a result of creating the single Person entity in the application model.

  1. Person.java: This is the primary class that implements the Person entity. It contains the 3 attributes from the model along with their getters and setters. AndroMDA automatically adds an id attribute that represents the unique identifier for Person instances in the database. In addition, AndroMDA generates equals() and hashCode() methods for the entity. Note that Person is an abstract class - it cannot be instantiated. The PersonImpl class described below, is a concrete class that extends Person. It can be instantiated using the factory methods imbedded in the Person class.
  2. PersonImpl.java: As mentioned above PersonImpl is a concrete extension of the Person class. It is meant to be a container for any custom code that developers would like to add to the Person entity.
  3. PersonDao.java: Data access objects for any entity are create as a trio of classes: an interface, an abstract base class and a concrete implementation. PersonDao is the interface for the Person data access object. It specifies CRUD methods for the DAO.
  4. PersonDaoBase.java: PersonDaoBase implements all of the CRUD methods specified in the PersonDao interface class.
  5. PersonDaoImpl.java: PersonDaoImpl is a concrete extension of the PersonDaoBase class. It is meant to be a container for any custom code that developers would like to add to the Person data access object.
  6. Person.hbm.xml: This is the Hibernate mapping file that maps the Person entity to its relational representation in the database.

Note that all six files are generated in the target folder of the core project. The target folder is intended for auto generated files only. None of the files in this folder should be modified by hand because code regeneration will wipe them out completely, thus deleting all your changes. It is also a best practice not to check this code into your source repository. Instead let your build script generate it on the fly.

By now you must be wondering where to add the custom code. We already said above that developers can add custom code into PersonImpl.java and PersonDaoImpl.java. But why are these classes generated in the target folder then? Well, AndroMDA is pretty smart. You have given it no indication that you want to write custom code. As long as that is the case it will keep generating the Impl classes in the target folder. However, as soon as you tell AndroMDA that you want to write some custom code in these classes, it will generate them in the src folder under the core project. Now you are free to modify the Impl classes and add any code to them. AndroMDA will never overwrite files in the project src folder. They are auto-generated only once for your convenience. In a later section of this tutorial we will show you how to write custom code.

Create the Schema

In addition to the entity and DAO classes shown above, AndroMDA automatically generates DDL to create tables in your database. This DDL is located at C:/timetracker/core/target/schema-create.sql. Open this file and review its contents. You should see the SQL to create the PERSON table. Follow the steps below to create this table in your database.

Note that PostgreSQL does not like the first statement in schema-create.sql (drop sequence hibernate_sequence). Please comment out this line for PostgreSQL.

  1. Open a Command Prompt and change your directory to C:/timetracker.
  2. Execute the command maven -o create-schema. This will create the PERSON table in your database. Use your database utilities to verify that the table has indeed been created.

What's Next?

Now that we have modeled the Person entity, it is time to create a value object to go with it. Click here to model the PersonVO value object.