This characteristic applies only to derived attributes. Derived
attributes are usually calculated from other attributes, such as
multiplying an employees monthly salary by twelve or deriving
a persons full name from first name and last name attributes.
The syntax of a derived attribute definition is a SQL statement.
To define an annual salary, for instance, you would multiple a MONTHLY_SALARY
column
by twelve. Figure
4-2 shows the Attribute Inspector for a derived
attribute that does just this.
Figure 4-2 Derived attribute syntax
Derived attributes are effectively read-only since there is no place to write them back to. You could get the value of a derived attribute and write it back to another column but that requires another attribute. And if you need to store the value of a derived attribute, its usually much better to perform the derivation in business logic rather than at the attribute level. (Alternatively, you could use custom read and write formats to accomplish this. See Read Format and Write Format). By deriving attributes at the business-logic level, you write the code in Java, you avoid writing database-specific SQL, and you get the full benefits of enterprise objects.
One of the most important benefits is the internal update notifications that enterprise objects send and receive. In the previous example, if you change an employees monthly salary, the derived attribute that calculates the annual salary is then incorrect. And since the attribute is derived, its value as it exists in the enterprise object is immutable. Unless the object is flushed from the access layers snapshot and refreshed, the derived attribute is stale and inaccurate.
Derived attributes can be useful but should probably be reserved for read-only applications and can usually be replaced by values derived in business logic. Also, because derived attributes dont directly map to anything in the database, they cannot be used for locking or as primary keys.