Added: empire-db/site/legacy/empiredb/hibernate.htm
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/empiredb/hibernate.htm?rev=1898936&view=auto
==============================================================================
--- empire-db/site/legacy/empiredb/hibernate.htm (added)
+++ empire-db/site/legacy/empiredb/hibernate.htm Mon Mar 14 20:41:26 2022
@@ -0,0 +1,409 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:v="urn:schemas-microsoft-com:vml" >
+<!-- #BeginTemplate "../main.dwt" -->
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta http-equiv="language" content="en" />
+ <meta name="robots" content="index, follow" />
+ <meta name="keywords" content="java, jar, jdbc, sql, data, metadata,
persistence, rdbms, orm, mapping" />
+ <meta name="description" content="Open Source relational data
persistence component." />
+
+ <!-- #BeginEditable "doctitle" -->
+<title>Empire-db - What's wrong with Hibernate and JPA</title>
+ <!-- #EndEditable -->
+
+ <script type="text/javascript" src="../js/prototype.js"></script>
+ <script type="text/javascript" src="../js/menu.js"></script>
+ <!-- #BeginEditable "javascripts" -->
+<script type="text/javascript" src="../js/maillink.js"></script>
+ <!-- #EndEditable -->
+
+ <link rel="shortcut icon" href="../empire-db.ico" />
+ <link rel="stylesheet" href="../css/layout.css" type="text/css" />
+ <!-- #BeginEditable "stylesheets" -->
+<style type="text/css">
+
+
+.style1 {
+ color: #000000;
+}
+</style>
+ <!-- #EndEditable -->
+</head>
+
+<body>
+<div id="wrapper">
+
+ <!-- Header -->
+ <div id="header">
+ <div id="logo">
+ <img src="../images/logos/empire-db-logo.gif"
alt="Empire-db: The relational data persistence component." />
+ </div>
+ <div id="asf">
+ <a id="asfhome" target="_blank"
href="https://www.apache.org"><img src="../images/logos/feather-small.gif"
alt="The Apache Software Foundation" /></a>
+ <label for="asfhome" >The Apache Software
Foundation</label>
+ </div>
+ <div style="clear:both"></div>
+ </div>
+
+ <!-- Top -->
+ <div id="top">
+ <div id="topbar"> </div>
+ </div>
+
+ <!-- Middle -->
+ <div id="middle">
+ <div id="left">
+ <div id="menuBox">
+ <ul id="mainMenu">
+ <li id="menu_home"><a
href="../index.html">Home</a></li>
+ <li id="menu_news"><a
href="../news.htm">News</a></li>
+ <li id="menu_empiredb"><a
href="empiredb.htm">Empire-db</a>
+ <ul
class="subMenu">
+ <li
id="menu_empiredb_extending_pattern"><a href="pattern.htm">The Empire DAO-<br
/>pattern</a></li>
+ <li
id="menu_empiredb_handling_metadata"><a href="metadata.htm">Handling data and
metadata</a></li>
+ <li
id="menu_empiredb_wrong"><a href="hibernate.htm">What's wrong with Hibernate
and JPA</a></li>
+ <li
id="menu_empiredb_stringfree"><a href="stringfree.htm">The principle
of<br/>string-free coding</a></li>
+ <li
id="menu_empiredb_faq"><a href="faq.htm">FAQ</a></li>
+ </ul>
+ </li>
+ <li id="menu_struts2ext"><a
href="../struts2ext/struts2ext.htm">Empire-db and Struts2</a>
+ <ul class="subMenu">
+ <li
id="menu_struts2ext_forms_controls"><a
href="../struts2ext/forms_controls.htm">Forms and controls</a></li>
+ <li
id="menu_struts2ext_rendering_parsing"><a
href="../struts2ext/rendering_parsing.htm">Rendering and parsing</a></li>
+ <!--<li
id="menu_struts2ext_tag_reference"><a href="struts2ext/tag_reference.htm">Tag
reference</a></li>-->
+ <li
id="menu_struts2ext_input_controls"><a
href="../struts2ext/input_controls.htm">Input controls</a></li>
+ </ul>
+ </li>
+ <li id="menu_downloads"><a
href="../downloads/latest.htm">Downloads</a>
+ <ul
class="subMenu">
+ <li
id="menu_downloads_previous"><a href="../downloads/previous.htm">Previous
releases</a></li>
+ <li
id="menu_downloads_license"><a href="../downloads/license.htm">License</a></li>
+ </ul>
+ </li>
+ <li id="menu_documentation"><a
href="../documentation/documentation.htm">Documentation</a>
+ <ul class="subMenu">
+ <li
id="menu_documentation_class_overview"><a
href="../documentation/class_overview.htm">Empire-db class<br
/>overview</a></li>
+ <li
id="menu_documentation_tutorials"><a
href="../documentation/tutorial.htm">Tutorial</a></li>
+ <li
id="menu_documentation_getting_started"><a
href="../documentation/getting_started.htm">Getting started</a></li>
+ <li
id="menu_documentation_reverse_engineering"><a
href="../documentation/reverse_engineering.htm">Reverse Engineering</a></li>
+ <li
id="menu_documentation_api"><a href="../documentation/api.htm">API</a></li>
+ </ul>
+ </li>
+ <li id="menu_community"><a
href="../community/community.htm">Community</a>
+ <ul class="subMenu">
+ <li
id="menu_community_mailing_lists"><a
href="../community/mailing_lists.htm">Mailing lists</a></li>
+ <li
id="menu_community_source_code"><a href="../community/source_code.htm">Source
code</a></li>
+ <li
id="menu_community_jira"><a href="../community/jira.htm">Ticketing &
Wiki</a></li>
+ <!--<li
id="menu_community_road_map"><a href="community/road_map.htm">Road
map</a></li>-->
+ <li
id="menu_community_contributors"><a
href="../community/contributors.htm">Contributors</a></li>
+ </ul>
+ </li>
+ <li id="menu_apache"><a
href="../apache.htm">About Apache</a>
+ <ul class="subMenu">
+ <li
id="menu_apache_home"><a href="https://www.apache.org">Apache home<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_donate"><a
href="https://www.apache.org/foundation/sponsorship.html">Sponsorship<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_thanks"><a
href="https://www.apache.org/foundation/thanks.html">Foundation thanks<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_security"><a
href="https://www.apache.org/security/">Security<span
class="asflink"> </span></a></li>
+ </ul>
+ </li>
+ <li id="menu_disclaimer"><a
href="https://www.apache.org/licenses/">License<span
class="asflink"> </span></a></li>
+ </ul>
+ </div>
+
+ </div>
+
+ <!-- #BeginEditable "menu" -->
+ <script type="text/javascript">
+ var menu = new Menu( 'mainMenu', 'menu_empiredb',
'menu_empiredb_wrong' );
+ var prev_page = "metadata.htm";
+ var next_page = "stringfree.htm";
+ </script>
+ <!-- #EndEditable -->
+ <script type="text/javascript">
+ /* <![CDATA[ */
+ if( menu ) {
+ // Menu fully opened (comment out if not wanted)
+ // menu.openAll();
+ /* ]]> */
+ }
+ </script>
+
+ <div id="main">
+
+ <div id="pathway">
+ <span style="float:left">
+ <!-- #BeginEditable "pathway" -->
+ <a href="empiredb.htm">Empire-db</a> » What's
wrong with Hibernate and JPA
+ <!-- #EndEditable -->
+ </span>
+ <a id="downloadLink" href="../downloads/latest.htm"
style="float:right">Download</a>
+ </div>
+
+ <div id="content">
+ <!-- #BeginEditable "content" -->
+ <h1>What's wrong with Hibernate and JPA</h1>
+ <p> For relational data persistence Hibernate is certainly the
most popular solution on the market. It has been around
+ for years and itâs probably been used in thousands of
projects. With
+ its latest version Hibernate even conforms to Sunâs Java
+ Persistence API (JPA) specification. So with Hibernate
offering everything why look for something else?</p>
+ <p> Well, we think that Hibernate and JPA are simply
not as perfect as it seems. To explain why, we
+ want to
+ provide you with a few reasons what we think is wrong
with Hibernate.
+ </p>
+
+ <h2>Data model definition: The trouble with the metadata</h2>
+ <p> In order to work every relational data persistence solution
needs to understand the underlying data model.
+ Hibernate offers two ways of defining the data model:
XML mapping files and annotations. Annotations have only
+ recently been introduced to simplify object relational
mapping and there are plenty of reasons why annotations
+ are clearly the superior solution over XML mapping.
Hence we will not consider XML mapping
+ any further and concentrate on annotations. However,
everything said
+ here concerning annotations applies to XML mapping in a similar
fashion.</p>
+ <p> The metadata you provide with annotations is required by
Hibernate
+ to know where and how to persist objects in the database. This
+ information however may not only be useful for Hibernate but
also for
+ your application logic and thus you may want to access it from
your code
+ instead of redundantly providing the same information again. A
good
+ example is e.g. the maximum length of a text field or whether
or not a
+ field is mandatory. On a user interface for example,
+ you may need this information for the display of a form
input control
+ or for validation.</p>
+ <p> With annotations you can access this information from your
code, but a particular annotation property cannot be
+ directly referenced from Java code in contrast to a
Java objectâs property. Hereâs an example:</p>
+ <p> This is how to access metadata using annotations:</p>
+ <pre><span style="color: #000000; ">Method field </span><span
style="color: #000000; ">=</span><span style="color: #000000; ">
Employee.</span><span style="color: #800080; ">class</span><span style="color:
#000000; ">.getDeclaredMethod(</span> <span style="color: #000000;
">"</span><span style="color: #0000FF; ">getFirstname</span><span
style="color: #000000; ">"</span><span style="color: #000000; ">,
</span><span style="color: #800080; ">new</span><span style="color: #000000; ">
Class[</span><span style="color: #000000; ">0</span><span style="color:
#000000; ">] );
+javax.persistence.Column col =</span><span style="color: #000000; ">
field.getAnnotation( javax.persistence.Column.</span><span style="color:
#800080; ">class</span><span style="color: #000000; "> );
+</span><span style="color: #800080; ">int</span><span style="color: #000000;
"> length </span><span style="color: #000000; ">=</span><span style="color:
#000000; "> col.length();</span></pre>
+
+ <p> This code achieves the same using Empire-db's object model
schema
+ definition:</p>
+ <pre><span style="color: #800080; ">int</span><span
style="color: #000000; "> length </span><span style="color: #000000;
">=</span><span style="color: #000000; "> </span><span
class="style1">mydb</span><font
color="#0000FF">.EMPLOYEES.FIRSTNAME</font><span style="color: #000000;
">.getSize();</span></pre>
+ <p><small style="display: block; margin: -10px 5px 0px
5px;">(Note that EMPLOYEES and FIRSTNAME are both <em>public final</em>
+ member fields that we write in all upper-case letters, but
could as
+ well be made accessible through getters â itâs your
code and your decision!)</small></p>
+
+ <p> Apart from the lack of compile-time safety and code
complexity on the client
+ side there are more issues why annotations are problematic. The
metadata
+ provided with the persistence annotations is often not
sufficient.
+ Additional annotations as with <a
href="https://www.hibernate.org/subprojects/validator.html">
+ Hibernate Validator</a> are required or you may want to define
and
+ assign custom annotations, making
+ your mapping and access code even less readable and manageable.
Not to
+ mention the impossibility of programmatic changes to your data
model at
+ runtime. With a Java object model for metadata in contrast all
this is
+ easy to achieve.
+ So why use annotations if you can do better without?</p>
+ <p> We think that annotations should not be used to provide
information
+ likely to be required for application logic. Rather they
+ should be used to provide code specific information for
compiler optimization or code documentation.
+ <code>@Deprecated</code> and
+ <code>@SuppressWarnings</code> are good examples for
acceptable
+ annotations. Even though annotations integrate much better with
Java
+ code than XML mapping files, they're far from being as
flexible as
+ normal interfaces and classes. Annotations are new and cool
now, but the
+ more extensively they are being used, the more they are
polluting your
+ source code. Don't let annotation hell follow XML
configuration hell.</p>
+
+ <h2>Data object definition: The getter setter mania</h2>
+ <p> Besides the metadata we also need somewhere to
store and access
+ our data. For Hibernate and JPA this is a JavaBean or
POJO that is
+ equipped with a member field<span style="FONT-SIZE:
9.5pt; FONT-FAMILY: 'Arial','sans-serif'">
+ </span>
+ <span lang="EN-GB" style="FONT-SIZE: 9.5pt;
FONT-FAMILY: 'Arial','sans-serif'">
+ as well as a </span>getter and a setter method for each
+ of the columns of the corresponding table. For large
data models this means
+ lots of lines of code. Hibernate tools
+ may be used to automatically generate all this code using
reverse engineering.
+ However for large and mature projects you may run into
the problem that once you
+ have manually changed bean or mapping code â
+ and you want to keep that change â automatic tools
are problematic.
+ So very often all this code including the metadata is
maintained by hand. Even worse, since these
+ objects are usually used as data
+ transfer objects in order to fill business objects,
youâll find endless lines of code where property values are copied
+ from one Java object to another. So whatâs the point
in having all these getters and setters in the first place?</p>
+ <p> With Empire-db's dynamic beans you only have one generic
getter and setter
+ for each entity that both have already been implemented. The
+ amount of classes may stay the same as we also
recommended creating an individual data object class for each database
+ entity - although this is not necessary when using a
generic DBRecord object. But we recommend this
+ for two reasons: The first one is again type-safety,
since you want your internal code to rely on certain entities.
+ Secondly it is likely that, as your project grows, you
will need to override existing and implement new methods there.
+ But even so, due to the absence of all those member fields and
their
+ corresponding getter and setter methods you will end up with
considerably less
+ code to maintain. Still you may add special getters and setters
for
+ individual columns if necessary or convenient.</p>
+
+ <h2>Dynamic queries: The select dilemma</h2>
+ <p> What we expect from a relational data persistence
solution is good support for dynamic query generation, so let's look
+ at how dynamic queries are handled. Again Hibernate
offers two
+ options: HQL and the criteria API. HQL is a language of its
+ own which you have to learn first. It's basically an
SQL dialect with Java code mapping extensions. After all, it's
+ provided or assembled using unsafe string literals and the
problem comes when trying to build complex statements with conditionally added
+ constraints and joins. We think that at some point of
complexity such building code becomes simply
+ unmaintainable. The
+ criteria API is better from this respect but on the
other hand - as
+ we found - too limited in its capabilities.</p>
+ <p> But there is another issue:
+ A common programming task is, that you need a special
view of your data that will contain only few columns collected
+ or even calculated from one or more tables. The result
may be displayed to a user or used for other processing purposes.</p>
+ <p> For this Hibernate HQL offers the possibility to define the
select
+ clause, ideally giving it a special <span
class="style1">"</span>result<span class="style1">"</span>
+ bean that holds exactly the data that you need, even
transformed with
+ SQL functions such as string concatenation or numeric
calculations.
+ Strangely we found that in many projects this feature is rarely
used.
+ Instead people were working with the full entity beans, which
meant that
+ far more attributes than necessary were loaded from the
database. For
+ entity relation resolving Hibernate either uses joins (eager
mode)
+ loading all referenced entities as well or - with lazy loading
enabled â
+ additional queries are performed, one for each unique
referenced object
+ â sometimes even just to access one simple attribute. So in
fact
+ instead of one bean object per row holding say 5 attributes, 5
+ objects a row holding together over 50 attributes are loaded.
It is
+ fairly obvious that this is not something you'd call the
perfect
+ solution.</p>
+ <p> Now the question here is: if people fail to take the right
approach, is it the people's or the tool's fault?
+ <br />
+ In order to find
+ out, I asked myself: Would I â if I were using
Hibernate â always use result beans for my read only queries or would I
+ work with the full entity beans?</p>
+ <p> From a performance perspective I would definitely use the
result beans. But from a code quality perspective maybe I would
+ not.
+ After all an expression like</p>
+ <pre><span style="color: #000000; ">filter.append(</span><span
style="color: #000000; ">"</span><font color="#0000FF">select</font><font
color="#0000FF"> new EmployeeResult(employee.employeeId,
+ employee.firstname || ', ' || employee.lastname,
+ employee.gender, employee.dateOfBirth,
+ department.name) </font><span style="color: #000000;
">"</span><span style="color: #000000; ">);</span></pre>
+ <p> isn't exactly going to improve my code quality. Apart from
avoiding spelling mistakes also the number and type of my result
+ bean's constructor parameters must match this code. Errors will
be detected only at runtime making every mistake a tedious
+ experience. And after all - I must admit â I'd sometimes
probably be just too lazy to type in all those
+ property names
+ even with their entity prefix.<br />
+ So in the end I'd probably be using both approaches
depending on the size of the entities and the nature of the query.
+ However I can understand why people shy away from this
efficient and sensible feature â rather paying the price with
+ high memory consumption and poor performance.</p>
+ <p> With Empire-db it's so much easier. Here you would
definitely
+ transform and select the columns as you need them in your
+ result set, since the cost of doing so is so much
lower. First you browse all columns for your selection, even including
+ transformation functions, comfortably using your IDE's
code completion. Then you can store them either manually or
+ automatically in a JavaBean using either the
constructor or setters. And most important: you can usually do all this
+ completely string-free with 100% compile-time safety.
Here's an example:</p>
+ <p><strong>To build the following SQL (Oracle
syntax):</strong></p>
+ <pre><span style="color: #0000FF; ">SELECT</span><span
style="color: #000000; "> t2.EMPLOYEE_ID, t2.LASTNAME </span><span
style="color: #808080; ">||</span><span style="color: #000000; "> </span><span
style="color: #FF0000; ">'</span><span style="color: #FF0000; ">, </span><span
style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span
style="color: #808080; ">||</span><span style="color: #000000; "> t2.FIRSTNAME
</span><span style="color: #0000FF; ">AS</span><span style="color: #000000; ">
NAME,
+ t1.NAME </span><span style="color: #0000FF; ">AS</span><span
style="color: #000000; "> DEPARTMENT
+</span><span style="color: #0000FF; ">FROM</span><span style="color: #000000;
"> (DEPARTMENTS t1 </span><span style="color: #0000FF; ">INNER</span><span
style="color: #000000; "> </span><span style="color: #0000FF;
">JOIN</span><span style="color: #000000; "> EMPLOYEES t2
+ </span><span style="color: #0000FF; ">ON</span><span style="color:
#000000; "> t2.DEPARTMENT_ID </span><span style="color: #808080;
">=</span><span style="color: #000000; "> t1.DEPARTMENT_ID)
+</span><span style="color: #0000FF; ">WHERE</span><span style="color: #000000;
"> </span><span style="color: #FF00FF; ">upper</span><span style="color:
#000000; ">(t2.LASTNAME) </span><span style="color: #808080; ">LIKE</span><span
style="color: #000000; "> </span><span style="color: #FF00FF;
">upper</span><span style="color: #000000; ">(</span><span style="color:
#FF0000; ">'</span><span style="color: #FF0000; ">Foo%</span><span
style="color: #FF0000; ">'</span><span style="color: #000000; ">) </span><span
style="color: #808080; ">AND</span><span style="color: #000000; ">
t2.RETIRED</span><span style="color: #808080; ">=</span><span style="color:
#800000; font-weight: bold; ">0</span><span style="color: #000000; ">
+</span><span style="color: #0000FF; ">ORDER</span><span style="color: #000000;
"> </span><span style="color: #0000FF; ">BY</span><span style="color: #000000;
"> t2.LASTNAME, t2.FIRSTNAME</span></pre>
+ <p><strong>With Empire-db you write:</strong></p>
+ <pre><span style="color: #000000; ">SampleDB db </span><span
style="color: #000000; ">=</span><span style="color: #000000; "> getDatabase();
+</span><span style="color: #008000; ">//</span><span style="color: #008000; ">
Declare shortcuts (not necessary but convenient)</span><span style="color:
#008000; ">
+</span><span style="color: #000000; ">SampleDB.Employees EMP </span><span
style="color: #000000; ">=</span><span style="color: #000000; "> db.EMPLOYEES;
+SampleDB.Departments DEP </span><span style="color: #000000; ">=</span><span
style="color: #000000; "> db.DEPARTMENTS;
+</span><span style="color: #008000; ">//</span><span style="color: #008000; ">
Create a command object</span><span style="color: #008000; ">
+</span><span style="color: #000000; ">DBCommand cmd </span><span style="color:
#000000; ">=</span><span style="color: #000000; "> db.createCommand();
+</span><span style="color: #008000; ">//</span><span style="color: #008000; ">
Select columns</span><span style="color: #008000; ">
+</span><span style="color: #000000; ">cmd.select(EMP.EMPLOYEE_ID);
+cmd.select(EMP.LASTNAME.append(</span><span style="color: #000000;
">"</span><span style="color: #000000; ">, </span><span style="color:
#000000; ">"</span><span style="color: #000000;
">).append(EMP.FIRSTNAME).as(</span><span style="color: #000000;
">"</span><span style="color: #000000; ">NAME</span><span style="color:
#000000; ">"</span><span style="color: #000000; ">));
+cmd.select(DEP.NAME.as(</span><span style="color: #000000;
">"</span><span style="color: #000000; ">DEPARTMENT</span><span
style="color: #000000; ">"</span><span style="color: #000000; ">));
+</span><span style="color: #008000; ">//</span><span style="color: #008000; ">
Join tables</span><span style="color: #008000; ">
+</span><span style="color: #000000; ">cmd.join (DEP.DEPARTMENT_ID,
EMP.DEPARTMENT_ID);
+</span><span style="color: #008000; ">//</span><span style="color: #008000; ">
Set constraints</span><span style="color: #008000; ">
+</span><span style="color: #000000;
">cmd.where(EMP.LASTNAME.likeUpper(</span><span style="color: #000000;
">"</span><span style="color: #000000; ">Foo%</span><span style="color:
#000000; ">"</span><span style="color: #000000; ">));
+cmd.where(EMP.RETIRED.is(</span><span style="color: #0000FF;
">false</span><span style="color: #000000; ">));
+</span><span style="color: #008000; ">//</span><span style="color: #008000; ">
Set order</span><span style="color: #008000; ">
+</span><span style="color: #000000; ">cmd.orderBy(EMP.LASTNAME);
+cmd.orderBy(EMP.FIRSTNAME);</span></pre>
+
+ <h1>Our conclusion</h1>
+ <p> Hibernate is in fact one of the most advanced
traditional ORM solutions
+ available. The problem with ORM however is,
+ that itâs designed primarily to work with
full entities. Relational databases on the other hand offer powerful
+ capabilities for combining, filtering and
transforming entities and their attributes. In order to retain this
+ flexibility Hibernate offers various features
to bridge that gap. But in order to utilize these features properly
+ youâve got to make lots of decisions: XML or
annotations, HQL or criteria API, lazy or eager fetching and so on.
+ What Hibernate internally does and especially
when it actually performs a database operation is not always
+ transparent (if you set logging to debug level
- you can grasp some of its complexity). Hibernate probably does a
+ good job if used and configured properly, but
it requires a lot of caution and itâs a long way getting there.
+ Especially if youâre not yet familiar
with Hibernate, the learning curve is steep.</p>
+ <p> The one thing that Hibernate lacks most is support
for compile-time safety. With both HQL and criteria API you
+ need to provide property names or even entire
SQL fragments as string
+ literals â making each data model change a risk â
+ which can only be addressed through extensive
and expensive testing.</p>
+ <p> Empire-db on contrary addresses compile-time safety
by offering a type safe API based on a Java object model
+ database definition. Whenever you change this
model description your Java compiler will tell you exactly which
+ lines of code are affected by that change. This
dramatically improves code quality and thus reduces the amount
+ and expense of testing. As a side effect your
coding productivity increases as your IDE will allow you to
+ browse all tables, columns and even SQL
functions when building dynamic queries. </p>
+ <p> Empire-db is not an ORM solution as you know it.
Its focus is clearly on modelling the way relational databases
+ work in Java and not vice versa. Empire-db is
passive and does not interfere with your connection and transaction
+ handling â making it easy to integrate and
requiring zero configuration. It does not automatically resolve object
+ references but since you select the data
exactly as you need it, there is rarely demand for this. Still if you
+ need it, you may simply add a getter with a few
simple lines of code. In this case â we believe â that less
+ sometimes is more.</p>
+ <p> We recommend that if you are not very familiar with
SQL and all you need is to store away and reload your POJO's, Hibernate or
another JPA implementation is probably the
+ better choice. But if you want to get the most out of
+ SQL and you want to keep full control over when
which statements are executed, with all the additional benefits
+ of metadata access and compile-time safety then
you really should give Empire-db a go.</p>
+ <p> Note: If you feel that any of the criticism we made
about Hibernate is without reason please let us know.
+ E-mail: <a id="mail_comment"><img
style="vertical-align: bottom;padding-top:2px"
src="../images/mail/empire-comment.gif" alt="" /></a></p>
+
+ <script type="text/javascript">
+ new MailLink( 'mail_comment', 'comment',
'empire-db.org' );
+ </script>
+ <!-- #EndEditable --></div>
+
+ <div id="nav">
+ <hr />
+ <div id="nav_prev">
+ <a id="prev" href=""><img
src="../images/prev.gif" alt="" /> Previous Page</a>
+
+ </div>
+ <div id="nav_next">
+
+ <a id="next" href="">Next Page <img
src="../images/next.gif" alt="" /></a>
+ </div>
+ <div style="clear: both;"></div>
+ </div>
+
+ <script type="text/javascript">
+ /* <![CDATA[ */
+ if( ( typeof(prev_page) == "undefined" ||
prev_page == "" ) &&
+ ( typeof(next_page) == "undefined" ||
next_page == "" ) )
+ {
+ $( 'nav' ).hide();
+ }
+ else
+ {
+ if( typeof(prev_page) != "undefined" &&
prev_page != "" ) {
+ $( 'prev' ).href = prev_page;
+ $( 'prev' ).show();
+ }
+ else {
+ $( 'prev' ).hide();
+ }
+
+ if( typeof(next_page) != "undefined" &&
next_page !="" ) {
+ $( 'next' ).href = next_page;
+ $( 'next' ).show();
+ }
+ else {
+ $( 'next' ).hide();
+ }
+ }
+ /* ]]> */
+ </script>
+
+ </div>
+
+ </div>
+
+ <!-- Footer -->
+ <div id="footer">
+ <div class="cr"><small>Copyright © 2008-2021, The Apache
Software Foundation</small></div>
+ <div class="tm"><small>Apache Empire-db, Empire-db, Apache, the
Apache feather logo, and the Apache Empire-db project logo are trademarks of
The Apache Software Foundation</small></div>
+ </div>
+
+</div>
+
+</body>
+<!-- #EndTemplate -->
+</html>
\ No newline at end of file
Propchange: empire-db/site/legacy/empiredb/hibernate.htm
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: empire-db/site/legacy/empiredb/metadata.htm
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/empiredb/metadata.htm?rev=1898936&view=auto
==============================================================================
--- empire-db/site/legacy/empiredb/metadata.htm (added)
+++ empire-db/site/legacy/empiredb/metadata.htm Mon Mar 14 20:41:26 2022
@@ -0,0 +1,235 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb" >
+<!-- #BeginTemplate "../main.dwt" -->
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta http-equiv="language" content="en" />
+ <meta name="robots" content="index, follow" />
+ <meta name="keywords" content="java, jar, jdbc, sql, data, metadata,
persistence, rdbms, orm, mapping" />
+ <meta name="description" content="Open Source relational data
persistence component." />
+
+ <!-- #BeginEditable "doctitle" -->
+<title>Empire-db - Handling Data and Metadata</title>
+ <!-- #EndEditable -->
+
+ <script type="text/javascript" src="../js/prototype.js"></script>
+ <script type="text/javascript" src="../js/menu.js"></script>
+ <!-- #BeginEditable "javascripts" -->
+ <!-- #EndEditable -->
+
+ <link rel="shortcut icon" href="../empire-db.ico" />
+ <link rel="stylesheet" href="../css/layout.css" type="text/css" />
+ <!-- #BeginEditable "stylesheets" -->
+ <!-- #EndEditable -->
+</head>
+
+<body>
+<div id="wrapper">
+
+ <!-- Header -->
+ <div id="header">
+ <div id="logo">
+ <img src="../images/logos/empire-db-logo.gif"
alt="Empire-db: The relational data persistence component." />
+ </div>
+ <div id="asf">
+ <a id="asfhome" target="_blank"
href="https://www.apache.org"><img src="../images/logos/feather-small.gif"
alt="The Apache Software Foundation" /></a>
+ <label for="asfhome" >The Apache Software
Foundation</label>
+ </div>
+ <div style="clear:both"></div>
+ </div>
+
+ <!-- Top -->
+ <div id="top">
+ <div id="topbar"> </div>
+ </div>
+
+ <!-- Middle -->
+ <div id="middle">
+ <div id="left">
+ <div id="menuBox">
+ <ul id="mainMenu">
+ <li id="menu_home"><a
href="../index.html">Home</a></li>
+ <li id="menu_news"><a
href="../news.htm">News</a></li>
+ <li id="menu_empiredb"><a
href="empiredb.htm">Empire-db</a>
+ <ul
class="subMenu">
+ <li
id="menu_empiredb_extending_pattern"><a href="pattern.htm">The Empire DAO-<br
/>pattern</a></li>
+ <li
id="menu_empiredb_handling_metadata"><a href="metadata.htm">Handling data and
metadata</a></li>
+ <li
id="menu_empiredb_wrong"><a href="hibernate.htm">What's wrong with Hibernate
and JPA</a></li>
+ <li
id="menu_empiredb_stringfree"><a href="stringfree.htm">The principle
of<br/>string-free coding</a></li>
+ <li
id="menu_empiredb_faq"><a href="faq.htm">FAQ</a></li>
+ </ul>
+ </li>
+ <li id="menu_struts2ext"><a
href="../struts2ext/struts2ext.htm">Empire-db and Struts2</a>
+ <ul class="subMenu">
+ <li
id="menu_struts2ext_forms_controls"><a
href="../struts2ext/forms_controls.htm">Forms and controls</a></li>
+ <li
id="menu_struts2ext_rendering_parsing"><a
href="../struts2ext/rendering_parsing.htm">Rendering and parsing</a></li>
+ <!--<li
id="menu_struts2ext_tag_reference"><a href="struts2ext/tag_reference.htm">Tag
reference</a></li>-->
+ <li
id="menu_struts2ext_input_controls"><a
href="../struts2ext/input_controls.htm">Input controls</a></li>
+ </ul>
+ </li>
+ <li id="menu_downloads"><a
href="../downloads/latest.htm">Downloads</a>
+ <ul
class="subMenu">
+ <li
id="menu_downloads_previous"><a href="../downloads/previous.htm">Previous
releases</a></li>
+ <li
id="menu_downloads_license"><a href="../downloads/license.htm">License</a></li>
+ </ul>
+ </li>
+ <li id="menu_documentation"><a
href="../documentation/documentation.htm">Documentation</a>
+ <ul class="subMenu">
+ <li
id="menu_documentation_class_overview"><a
href="../documentation/class_overview.htm">Empire-db class<br
/>overview</a></li>
+ <li
id="menu_documentation_tutorials"><a
href="../documentation/tutorial.htm">Tutorial</a></li>
+ <li
id="menu_documentation_getting_started"><a
href="../documentation/getting_started.htm">Getting started</a></li>
+ <li
id="menu_documentation_reverse_engineering"><a
href="../documentation/reverse_engineering.htm">Reverse Engineering</a></li>
+ <li
id="menu_documentation_api"><a href="../documentation/api.htm">API</a></li>
+ </ul>
+ </li>
+ <li id="menu_community"><a
href="../community/community.htm">Community</a>
+ <ul class="subMenu">
+ <li
id="menu_community_mailing_lists"><a
href="../community/mailing_lists.htm">Mailing lists</a></li>
+ <li
id="menu_community_source_code"><a href="../community/source_code.htm">Source
code</a></li>
+ <li
id="menu_community_jira"><a href="../community/jira.htm">Ticketing &
Wiki</a></li>
+ <!--<li
id="menu_community_road_map"><a href="community/road_map.htm">Road
map</a></li>-->
+ <li
id="menu_community_contributors"><a
href="../community/contributors.htm">Contributors</a></li>
+ </ul>
+ </li>
+ <li id="menu_apache"><a
href="../apache.htm">About Apache</a>
+ <ul class="subMenu">
+ <li
id="menu_apache_home"><a href="https://www.apache.org">Apache home<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_donate"><a
href="https://www.apache.org/foundation/sponsorship.html">Sponsorship<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_thanks"><a
href="https://www.apache.org/foundation/thanks.html">Foundation thanks<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_security"><a
href="https://www.apache.org/security/">Security<span
class="asflink"> </span></a></li>
+ </ul>
+ </li>
+ <li id="menu_disclaimer"><a
href="https://www.apache.org/licenses/">License<span
class="asflink"> </span></a></li>
+ </ul>
+ </div>
+
+ </div>
+
+ <!-- #BeginEditable "menu" -->
+ <script type="text/javascript">
+ var menu = new Menu( 'mainMenu', 'menu_empiredb',
'menu_empiredb_handling_metadata' );
+ var prev_page = "pattern.htm";
+ var next_page = "hibernate.htm";
+ </script>
+ <!-- #EndEditable -->
+ <script type="text/javascript">
+ /* <![CDATA[ */
+ if( menu ) {
+ // Menu fully opened (comment out if not wanted)
+ // menu.openAll();
+ /* ]]> */
+ }
+ </script>
+
+ <div id="main">
+
+ <div id="pathway">
+ <span style="float:left">
+ <!-- #BeginEditable "pathway" -->
+ <a href="empiredb.htm">Empire-db</a> » Handling
data and metadata
+ <!-- #EndEditable -->
+ </span>
+ <a id="downloadLink" href="../downloads/latest.htm"
style="float:right">Download</a>
+ </div>
+
+ <div id="content">
+ <!-- #BeginEditable "content" -->
+ <h1>Handling data and metadata</h1>
+ <p> Many persistence solutions are primarily designed for
working with
+ JavaBeans representing full database entities. For foreign key
+ relationships the referenced objects are automatically loaded
when
+ needed to build an object hierarchy that directly reflects the
data
+ model. However in many cases it is neither desirable nor
necessary to
+ work with full entities. Relational databases are extremely
efficient
+ when it comes to combining individual columns joined and
gathered from
+ various tables, sometimes even transformed or calculated. In
most cases this result is used
+ merely for display and selection purposes and thus does
not require updating the individual rows.</p>
+ <p> With Empire-db both working with full database entities and
working with
+ complex and varying query results are equally well
+ supported. Consequently Empire-db distinguishes between
read only data and full entity records which are
+ updateable. This however does not only affect access to
data but also metadata access, since for updateable data more
+ meta information is required. Hence the distinction is
also made on the metadata side distinguishing a column
+ expression for read only data and a full column for
updateable data.</p>
+ <p> For implementing this behavior Empire-db offers four
interfaces: two each for data and metadata access and two
+ each for read only and updatable data. Note that these
interfaces are not limited to relational databases and
+ might as well be used for other data sources. The
following matrix shows the four interfaces and their
+ relationships:</p>
+ <img style="display: block; margin: auto;"
src="../images/diagrams/empire-data-interfaces.gif" alt="" />
+ <p> In Empire-db terms the Record is the thing that holds the
data and the
+ Column the thing that holds the metadata.
+ For data access Empire-db distinguishes between record
data which is read only and possibly the result of any SQL
+ query and a full entity record which is returned by a
Data Access Object (i.e. a table or a view). Accordingly
+ it distinguishes between a column expression which
provides display metadata for displaying a value and a full
+ featured column which also provides information
required for data input.</p>
+ <p> When working with Empire-db you will notice the following
classes implementing these interfaces:</p>
+ <table style="margin-bottom: 10px;">
+ <thead><tr><th>Interface</th><th>
+ <p align="left">Implementations provided by
Empire-db</th></tr></thead>
+ <tbody>
+
<tr><td>RecordData</td><td>DBRecordData(abstract), DBReader</td></tr>
+ <tr><td>Record</td><td>DBRecord</td></tr>
+ <tr><td>ColumnExpr</td><td>DBColumnExpr
(abstract), DBAliasExpr, DBConcatExpr, DBFuncExpr,
+ etc...</td></tr>
+ <tr><td>Column</td><td>DBColumn (abstract),
DBTableColumn, DBViewColumn</td></tr>
+ </tbody>
+ </table>
+ <p> Besides those implementations you are free to use
these
+ interfaces for your own objects and provide your own
implementation.</p>
+ <!-- #EndEditable --></div>
+
+ <div id="nav">
+ <hr />
+ <div id="nav_prev">
+ <a id="prev" href=""><img
src="../images/prev.gif" alt="" /> Previous Page</a>
+
+ </div>
+ <div id="nav_next">
+
+ <a id="next" href="">Next Page <img
src="../images/next.gif" alt="" /></a>
+ </div>
+ <div style="clear: both;"></div>
+ </div>
+
+ <script type="text/javascript">
+ /* <![CDATA[ */
+ if( ( typeof(prev_page) == "undefined" ||
prev_page == "" ) &&
+ ( typeof(next_page) == "undefined" ||
next_page == "" ) )
+ {
+ $( 'nav' ).hide();
+ }
+ else
+ {
+ if( typeof(prev_page) != "undefined" &&
prev_page != "" ) {
+ $( 'prev' ).href = prev_page;
+ $( 'prev' ).show();
+ }
+ else {
+ $( 'prev' ).hide();
+ }
+
+ if( typeof(next_page) != "undefined" &&
next_page !="" ) {
+ $( 'next' ).href = next_page;
+ $( 'next' ).show();
+ }
+ else {
+ $( 'next' ).hide();
+ }
+ }
+ /* ]]> */
+ </script>
+
+ </div>
+
+ </div>
+
+ <!-- Footer -->
+ <div id="footer">
+ <div class="cr"><small>Copyright © 2008-2021, The Apache
Software Foundation</small></div>
+ <div class="tm"><small>Apache Empire-db, Empire-db, Apache, the
Apache feather logo, and the Apache Empire-db project logo are trademarks of
The Apache Software Foundation</small></div>
+ </div>
+
+</div>
+
+</body>
+<!-- #EndTemplate -->
+</html>
\ No newline at end of file
Propchange: empire-db/site/legacy/empiredb/metadata.htm
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: empire-db/site/legacy/empiredb/pattern.htm
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/empiredb/pattern.htm?rev=1898936&view=auto
==============================================================================
--- empire-db/site/legacy/empiredb/pattern.htm (added)
+++ empire-db/site/legacy/empiredb/pattern.htm Mon Mar 14 20:41:26 2022
@@ -0,0 +1,239 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb" >
+<!-- #BeginTemplate "../main.dwt" -->
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta http-equiv="language" content="en" />
+ <meta name="robots" content="index, follow" />
+ <meta name="keywords" content="java, jar, jdbc, sql, data, metadata,
persistence, rdbms, orm, mapping" />
+ <meta name="description" content="Open Source relational data
persistence component." />
+
+ <!-- #BeginEditable "doctitle" -->
+<title>Empire-db - The Empire DAO-Pattern</title>
+ <!-- #EndEditable -->
+
+ <script type="text/javascript" src="../js/prototype.js"></script>
+ <script type="text/javascript" src="../js/menu.js"></script>
+ <!-- #BeginEditable "javascripts" -->
+ <!-- #EndEditable -->
+
+ <link rel="shortcut icon" href="../empire-db.ico" />
+ <link rel="stylesheet" href="../css/layout.css" type="text/css" />
+ <!-- #BeginEditable "stylesheets" -->
+ <!-- #EndEditable -->
+</head>
+
+<body>
+<div id="wrapper">
+
+ <!-- Header -->
+ <div id="header">
+ <div id="logo">
+ <img src="../images/logos/empire-db-logo.gif"
alt="Empire-db: The relational data persistence component." />
+ </div>
+ <div id="asf">
+ <a id="asfhome" target="_blank"
href="https://www.apache.org"><img src="../images/logos/feather-small.gif"
alt="The Apache Software Foundation" /></a>
+ <label for="asfhome" >The Apache Software
Foundation</label>
+ </div>
+ <div style="clear:both"></div>
+ </div>
+
+ <!-- Top -->
+ <div id="top">
+ <div id="topbar"> </div>
+ </div>
+
+ <!-- Middle -->
+ <div id="middle">
+ <div id="left">
+ <div id="menuBox">
+ <ul id="mainMenu">
+ <li id="menu_home"><a
href="../index.html">Home</a></li>
+ <li id="menu_news"><a
href="../news.htm">News</a></li>
+ <li id="menu_empiredb"><a
href="empiredb.htm">Empire-db</a>
+ <ul
class="subMenu">
+ <li
id="menu_empiredb_extending_pattern"><a href="pattern.htm">The Empire DAO-<br
/>pattern</a></li>
+ <li
id="menu_empiredb_handling_metadata"><a href="metadata.htm">Handling data and
metadata</a></li>
+ <li
id="menu_empiredb_wrong"><a href="hibernate.htm">What's wrong with Hibernate
and JPA</a></li>
+ <li
id="menu_empiredb_stringfree"><a href="stringfree.htm">The principle
of<br/>string-free coding</a></li>
+ <li
id="menu_empiredb_faq"><a href="faq.htm">FAQ</a></li>
+ </ul>
+ </li>
+ <li id="menu_struts2ext"><a
href="../struts2ext/struts2ext.htm">Empire-db and Struts2</a>
+ <ul class="subMenu">
+ <li
id="menu_struts2ext_forms_controls"><a
href="../struts2ext/forms_controls.htm">Forms and controls</a></li>
+ <li
id="menu_struts2ext_rendering_parsing"><a
href="../struts2ext/rendering_parsing.htm">Rendering and parsing</a></li>
+ <!--<li
id="menu_struts2ext_tag_reference"><a href="struts2ext/tag_reference.htm">Tag
reference</a></li>-->
+ <li
id="menu_struts2ext_input_controls"><a
href="../struts2ext/input_controls.htm">Input controls</a></li>
+ </ul>
+ </li>
+ <li id="menu_downloads"><a
href="../downloads/latest.htm">Downloads</a>
+ <ul
class="subMenu">
+ <li
id="menu_downloads_previous"><a href="../downloads/previous.htm">Previous
releases</a></li>
+ <li
id="menu_downloads_license"><a href="../downloads/license.htm">License</a></li>
+ </ul>
+ </li>
+ <li id="menu_documentation"><a
href="../documentation/documentation.htm">Documentation</a>
+ <ul class="subMenu">
+ <li
id="menu_documentation_class_overview"><a
href="../documentation/class_overview.htm">Empire-db class<br
/>overview</a></li>
+ <li
id="menu_documentation_tutorials"><a
href="../documentation/tutorial.htm">Tutorial</a></li>
+ <li
id="menu_documentation_getting_started"><a
href="../documentation/getting_started.htm">Getting started</a></li>
+ <li
id="menu_documentation_reverse_engineering"><a
href="../documentation/reverse_engineering.htm">Reverse Engineering</a></li>
+ <li
id="menu_documentation_api"><a href="../documentation/api.htm">API</a></li>
+ </ul>
+ </li>
+ <li id="menu_community"><a
href="../community/community.htm">Community</a>
+ <ul class="subMenu">
+ <li
id="menu_community_mailing_lists"><a
href="../community/mailing_lists.htm">Mailing lists</a></li>
+ <li
id="menu_community_source_code"><a href="../community/source_code.htm">Source
code</a></li>
+ <li
id="menu_community_jira"><a href="../community/jira.htm">Ticketing &
Wiki</a></li>
+ <!--<li
id="menu_community_road_map"><a href="community/road_map.htm">Road
map</a></li>-->
+ <li
id="menu_community_contributors"><a
href="../community/contributors.htm">Contributors</a></li>
+ </ul>
+ </li>
+ <li id="menu_apache"><a
href="../apache.htm">About Apache</a>
+ <ul class="subMenu">
+ <li
id="menu_apache_home"><a href="https://www.apache.org">Apache home<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_donate"><a
href="https://www.apache.org/foundation/sponsorship.html">Sponsorship<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_thanks"><a
href="https://www.apache.org/foundation/thanks.html">Foundation thanks<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_security"><a
href="https://www.apache.org/security/">Security<span
class="asflink"> </span></a></li>
+ </ul>
+ </li>
+ <li id="menu_disclaimer"><a
href="https://www.apache.org/licenses/">License<span
class="asflink"> </span></a></li>
+ </ul>
+ </div>
+
+ </div>
+
+ <!-- #BeginEditable "menu" -->
+ <script type="text/javascript">
+ var menu = new Menu( 'mainMenu', 'menu_empiredb',
'menu_empiredb_extending_pattern' );
+ var prev_page = "empiredb.htm";
+ var next_page = "metadata.htm";
+ </script>
+ <!-- #EndEditable -->
+ <script type="text/javascript">
+ /* <![CDATA[ */
+ if( menu ) {
+ // Menu fully opened (comment out if not wanted)
+ // menu.openAll();
+ /* ]]> */
+ }
+ </script>
+
+ <div id="main">
+
+ <div id="pathway">
+ <span style="float:left">
+ <!-- #BeginEditable "pathway" -->
+ <a href="empiredb.htm">Empire-db</a> » The Empire
DAO-Pattern
+ <!-- #EndEditable -->
+ </span>
+ <a id="downloadLink" href="../downloads/latest.htm"
style="float:right">Download</a>
+ </div>
+
+ <div id="content">
+ <!-- #BeginEditable "content" -->
+ <h1>Extending the pattern</h1>
+ <p> Most business applications require access to data that is
available from persistent storage and still SQL based relational database
management systems (RDBMS) are the most popular type of storage. Access to
relational
+ database systems has been made available in Java
through the JDBC
+ interface for which all major database vendors
+ provide an implementation. Although JDBC is simple to
use on a low level, a lot of
+ hand work is required to
+ efficiently manage data transfer from and to business
objects. </p>
+ <p> Over the years several components have evolved, which
extend JDBC in
+ order to simplify data transfer and handling as well as making
code independent from the underlying database system's SQL dialect. For the
basic principle by which
+ such persistence solutions may work, Sun has defined a
pattern that describes how to use a Data Access Object
+ (DAO) to abstract and encapsulate all access to the
data source:
+ <a
href="https://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html">the
Data Access Object (DAO) pattern</a>.</p>
+ <p> However, the DAO pattern, as well as most of the popular
persistence components such as Hibernate, only focuses on data. But we
+ think that in most cases only about 5 to 10% of all
entity attributes are required for the implementation of application
+ logic. The rest is merely transferred from the database
to the client â e.g. a user
+ interface - and vice versa.<br />
+ On the other hand, metadata like e.g. value precision,
maximum field size or whether a
+ field is mandatory or not,
+ is often necessary for data display, input and
validation. Without metadata management such information is usually
+ split and repeated across all application layers. With
the provision of metadata these redundancies are reduced which
+ in turn simplifies development and reduces the amount
of testing required.</p>
+ <p> Empire-db has been designed from ground up to deal with
data and metadata. For metadata support Empire-db extends the
+ <a
href="https://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html">traditional
Data Access
+ Object (DAO) pattern</a> introducing a new <strong>Data
Info Object (DIO)</strong>. The DIO is a container for all
+ metadata related to a particular entity attribute.
Special support has been added for common data model and
+ some view
+ specific metadata attributes but you may also add your
own.</p>
+
+ <p> This is what Empire-dbâs extended DAO pattern looks
like:</p>
+ <img style="display: block; margin: auto;"
src="../images/diagrams/dao_pattern.gif" alt="" />
+
+ <p> Apart from the Data Info Object there are two more
noticeable differences to
+ <a
href="https://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html">classic
DAO pattern</a>:</p>
+ <ol>
+ <li><b>Empire-db works with dynamic rather than static
JavaBeans.</b><br />
+ Dynamic beans do not have a getter and setter
for every single property like normal JavaBeans.
+ Instead one generic getter and setter is used
which takes the desired field as a parameter. In order
+ to be type-safe Empire-db uses a column object
reference instead of a string to address the requested attribute.<br />
+ As an advantage it is not necessary to change
the entity bean when adding new attributes in the data model
+ and you may easily override the getter and
setter for generic processing.</li>
+ <li><b>The Empire-db Data Access Object only uses the
data objects and does not create them.</b><br />
+ The idea is that you may extend your data objects
and implement entity specific logic. So instead of
+ transferring and copying all data fields to your
business objects you may as well use them directly in or as
+ your business objects.</li>
+ </ol>
+ <!-- #EndEditable --></div>
+
+ <div id="nav">
+ <hr />
+ <div id="nav_prev">
+ <a id="prev" href=""><img
src="../images/prev.gif" alt="" /> Previous Page</a>
+
+ </div>
+ <div id="nav_next">
+
+ <a id="next" href="">Next Page <img
src="../images/next.gif" alt="" /></a>
+ </div>
+ <div style="clear: both;"></div>
+ </div>
+
+ <script type="text/javascript">
+ /* <![CDATA[ */
+ if( ( typeof(prev_page) == "undefined" ||
prev_page == "" ) &&
+ ( typeof(next_page) == "undefined" ||
next_page == "" ) )
+ {
+ $( 'nav' ).hide();
+ }
+ else
+ {
+ if( typeof(prev_page) != "undefined" &&
prev_page != "" ) {
+ $( 'prev' ).href = prev_page;
+ $( 'prev' ).show();
+ }
+ else {
+ $( 'prev' ).hide();
+ }
+
+ if( typeof(next_page) != "undefined" &&
next_page !="" ) {
+ $( 'next' ).href = next_page;
+ $( 'next' ).show();
+ }
+ else {
+ $( 'next' ).hide();
+ }
+ }
+ /* ]]> */
+ </script>
+
+ </div>
+
+ </div>
+
+ <!-- Footer -->
+ <div id="footer">
+ <div class="cr"><small>Copyright © 2008-2021, The Apache
Software Foundation</small></div>
+ <div class="tm"><small>Apache Empire-db, Empire-db, Apache, the
Apache feather logo, and the Apache Empire-db project logo are trademarks of
The Apache Software Foundation</small></div>
+ </div>
+
+</div>
+
+</body>
+<!-- #EndTemplate -->
+</html>
\ No newline at end of file
Propchange: empire-db/site/legacy/empiredb/pattern.htm
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: empire-db/site/legacy/empiredb/stringfree.htm
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/empiredb/stringfree.htm?rev=1898936&view=auto
==============================================================================
--- empire-db/site/legacy/empiredb/stringfree.htm (added)
+++ empire-db/site/legacy/empiredb/stringfree.htm Mon Mar 14 20:41:26 2022
@@ -0,0 +1,250 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb" >
+<!-- #BeginTemplate "../main.dwt" -->
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta http-equiv="language" content="en" />
+ <meta name="robots" content="index, follow" />
+ <meta name="keywords" content="java, jar, jdbc, sql, data, metadata,
persistence, rdbms, orm, mapping" />
+ <meta name="description" content="Open Source relational data
persistence component." />
+
+ <!-- #BeginEditable "doctitle" -->
+<title>Empire-db - The principle of string-free coding</title>
+ <!-- #EndEditable -->
+
+ <script type="text/javascript" src="../js/prototype.js"></script>
+ <script type="text/javascript" src="../js/menu.js"></script>
+ <!-- #BeginEditable "javascripts" -->
+ <!-- #EndEditable -->
+
+ <link rel="shortcut icon" href="../empire-db.ico" />
+ <link rel="stylesheet" href="../css/layout.css" type="text/css" />
+ <!-- #BeginEditable "stylesheets" -->
+ <!-- #EndEditable -->
+</head>
+
+<body>
+<div id="wrapper">
+
+ <!-- Header -->
+ <div id="header">
+ <div id="logo">
+ <img src="../images/logos/empire-db-logo.gif"
alt="Empire-db: The relational data persistence component." />
+ </div>
+ <div id="asf">
+ <a id="asfhome" target="_blank"
href="https://www.apache.org"><img src="../images/logos/feather-small.gif"
alt="The Apache Software Foundation" /></a>
+ <label for="asfhome" >The Apache Software
Foundation</label>
+ </div>
+ <div style="clear:both"></div>
+ </div>
+
+ <!-- Top -->
+ <div id="top">
+ <div id="topbar"> </div>
+ </div>
+
+ <!-- Middle -->
+ <div id="middle">
+ <div id="left">
+ <div id="menuBox">
+ <ul id="mainMenu">
+ <li id="menu_home"><a
href="../index.html">Home</a></li>
+ <li id="menu_news"><a
href="../news.htm">News</a></li>
+ <li id="menu_empiredb"><a
href="empiredb.htm">Empire-db</a>
+ <ul
class="subMenu">
+ <li
id="menu_empiredb_extending_pattern"><a href="pattern.htm">The Empire DAO-<br
/>pattern</a></li>
+ <li
id="menu_empiredb_handling_metadata"><a href="metadata.htm">Handling data and
metadata</a></li>
+ <li
id="menu_empiredb_wrong"><a href="hibernate.htm">What's wrong with Hibernate
and JPA</a></li>
+ <li
id="menu_empiredb_stringfree"><a href="stringfree.htm">The principle
of<br/>string-free coding</a></li>
+ <li
id="menu_empiredb_faq"><a href="faq.htm">FAQ</a></li>
+ </ul>
+ </li>
+ <li id="menu_struts2ext"><a
href="../struts2ext/struts2ext.htm">Empire-db and Struts2</a>
+ <ul class="subMenu">
+ <li
id="menu_struts2ext_forms_controls"><a
href="../struts2ext/forms_controls.htm">Forms and controls</a></li>
+ <li
id="menu_struts2ext_rendering_parsing"><a
href="../struts2ext/rendering_parsing.htm">Rendering and parsing</a></li>
+ <!--<li
id="menu_struts2ext_tag_reference"><a href="struts2ext/tag_reference.htm">Tag
reference</a></li>-->
+ <li
id="menu_struts2ext_input_controls"><a
href="../struts2ext/input_controls.htm">Input controls</a></li>
+ </ul>
+ </li>
+ <li id="menu_downloads"><a
href="../downloads/latest.htm">Downloads</a>
+ <ul
class="subMenu">
+ <li
id="menu_downloads_previous"><a href="../downloads/previous.htm">Previous
releases</a></li>
+ <li
id="menu_downloads_license"><a href="../downloads/license.htm">License</a></li>
+ </ul>
+ </li>
+ <li id="menu_documentation"><a
href="../documentation/documentation.htm">Documentation</a>
+ <ul class="subMenu">
+ <li
id="menu_documentation_class_overview"><a
href="../documentation/class_overview.htm">Empire-db class<br
/>overview</a></li>
+ <li
id="menu_documentation_tutorials"><a
href="../documentation/tutorial.htm">Tutorial</a></li>
+ <li
id="menu_documentation_getting_started"><a
href="../documentation/getting_started.htm">Getting started</a></li>
+ <li
id="menu_documentation_reverse_engineering"><a
href="../documentation/reverse_engineering.htm">Reverse Engineering</a></li>
+ <li
id="menu_documentation_api"><a href="../documentation/api.htm">API</a></li>
+ </ul>
+ </li>
+ <li id="menu_community"><a
href="../community/community.htm">Community</a>
+ <ul class="subMenu">
+ <li
id="menu_community_mailing_lists"><a
href="../community/mailing_lists.htm">Mailing lists</a></li>
+ <li
id="menu_community_source_code"><a href="../community/source_code.htm">Source
code</a></li>
+ <li
id="menu_community_jira"><a href="../community/jira.htm">Ticketing &
Wiki</a></li>
+ <!--<li
id="menu_community_road_map"><a href="community/road_map.htm">Road
map</a></li>-->
+ <li
id="menu_community_contributors"><a
href="../community/contributors.htm">Contributors</a></li>
+ </ul>
+ </li>
+ <li id="menu_apache"><a
href="../apache.htm">About Apache</a>
+ <ul class="subMenu">
+ <li
id="menu_apache_home"><a href="https://www.apache.org">Apache home<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_donate"><a
href="https://www.apache.org/foundation/sponsorship.html">Sponsorship<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_thanks"><a
href="https://www.apache.org/foundation/thanks.html">Foundation thanks<span
class="asflink"> </span></a></li>
+ <li
id="menu_apache_security"><a
href="https://www.apache.org/security/">Security<span
class="asflink"> </span></a></li>
+ </ul>
+ </li>
+ <li id="menu_disclaimer"><a
href="https://www.apache.org/licenses/">License<span
class="asflink"> </span></a></li>
+ </ul>
+ </div>
+
+ </div>
+
+ <!-- #BeginEditable "menu" -->
+ <script type="text/javascript">
+ var menu = new Menu( 'mainMenu', 'menu_empiredb',
'menu_empiredb_stringfree' );
+ var prev_page = "hibernate.htm";
+ var next_page = "faq.htm";
+ </script>
+ <!-- #EndEditable -->
+ <script type="text/javascript">
+ /* <![CDATA[ */
+ if( menu ) {
+ // Menu fully opened (comment out if not wanted)
+ // menu.openAll();
+ /* ]]> */
+ }
+ </script>
+
+ <div id="main">
+
+ <div id="pathway">
+ <span style="float:left">
+ <!-- #BeginEditable "pathway" -->
+ <a href="empiredb.htm">Empire-db</a> » The
principle of string-free coding
+ <!-- #EndEditable -->
+ </span>
+ <a id="downloadLink" href="../downloads/latest.htm"
style="float:right">Download</a>
+ </div>
+
+ <div id="content">
+ <!-- #BeginEditable "content" -->
+ <h1>The principle of string-free coding</h1>
+ <p> We believe that for the issue of code quality,
string literals are the root of all evil.
+ In data persistence string literals are often
used to specify property names or even whole
+ SQL fragments. This makes code harder to
develop and even harder to maintain and can only
+ be balanced through extensive and expensive
testing.</p>
+ <p> We further believe that the most powerful tool for
detecting and revealing errors is your
+ compiler. Thus we think that no XML files
should be used and code should be written in a
+ way that gives the compiler the opportunity of
performing this task as good as possible.
+ In practice this requires working with object
references rather than string literals
+ wherever possible.</p>
+ <p> For example instead of writing:</p>
+ <pre><span style="color: #000000; ">StringBuilder cmd
</span><span style="color: #000000; ">=</span><span style="color: #000000; ">
</span><span style="color: #800080; ">new</span><span style="color: #000000; ">
StringBuilder();
+...
+cmd.append(</span><span style="color: #000000; ">"</span><font
color="#0000FF">employee.lastname</font><font color="#0000FF"> like
'</font><span style="color: #000000; ">"</span><span style="color:
#000000; "> </span><span style="color: #000000; ">+</span><span style="color:
#000000; "> name </span><span style="color: #000000; ">+</span><span
style="color: #000000; "> </span><span style="color: #000000;
">"</span><span style="color: #0000FF; ">%' </span><span style="color:
#000000; ">"</span><span style="color: #000000; ">);</span></pre>
+
+ <p> it should rather be somewhat like:</p>
+ <pre><span style="color: #000000; ">DBCommand cmd
</span><span style="color: #000000; ">=</span><span style="color: #000000; ">
db.createCommand();
+...
+cmd.where(</span><font color="#0000FF">EMPLOYEES.LASTNAME</font><span
style="color: #000000; ">.like( name</span><span style="color: #000000;
">+</span><span style="color: #000000; ">"</span><span style="color:
#0000FF; ">%</span><span style="color: #000000; ">"</span><span
style="color: #000000; "> ));</span></pre>
+
+ <h1>Going beyond the persistence layer</h1>
+ <p> But our objective is not only to stop using string
literals in the persistence layer but
+ all the way up to the presentation layer. This
is especially hard for Web application development
+ as it means avoiding string literals in
JavaServer Pages as well, which in turn requires
+ avoiding expression languages (EL). However it
is possible. As an example consider a typical
+ data driven Web application based on JavaServer
Pages. With traditional Struts2 tags a particular
+ property must be specified in the JSP as
follows:</p>
+ <ol>
+ <li>For the list view when displaying a list of
query results:<pre><span style="color: #0000FF; "><</span><span
style="color: #800000; ">s:property </span><span style="color: #FF0000;
">value</span><span style="color: #0000FF;
">="employee.lastname"</span><span style="color: #0000FF;
">/></span></pre>
+ </li>
+ <li>In the form view when displaying an input
control for the field:<pre><span style="color: #0000FF; "><</span><span
style="color: #800000; ">s:textfield </span><span style="color: #FF0000;
">key</span><span style="color: #0000FF;
">="employee.lastname"</span><span style="color: #FF0000; ">
size</span><span style="color: #0000FF; ">="40"</span><span
style="color: #FF0000; "> required</span><span style="color: #0000FF;
">="true"</span><span style="color: #0000FF; ">/></span></pre>
+ </li>
+ </ol>
+ <p> Using object references this code can easily be
written string-free as follows:</p>
+ <ol>
+ <li>For the list view when displaying a list of
query results:<pre><span style="color: #0000FF; "><</span><span
style="color: #800000; ">td</span><span style="color: #0000FF;
">><</span><span style="color: #800000; ">s:property </span><span
style="color: #FF0000; ">value</span><span style="color: #0000FF;
">="<%= EMPLOYEES.LASTNAME.getName() %>"</span><span
style="color: #0000FF; ">/></</span><span style="color: #800000;
">td</span><span style="color: #0000FF; ">></span></pre>
+ or even simpler using
Empire-Struts2-Extensions:<pre><span style="color: #0000FF; "><</span><span
style="color: #800000; ">td</span><span style="color: #0000FF;
">><</span><span style="color: #800000; ">e:value </span><span
style="color: #FF0000; ">column</span><span style="color: #0000FF;
">="<%= EMPLOYEES.LASTNAME %>"</span><span style="color:
#FF0000; "> </span><span style="color: #0000FF; ">/></</span><span
style="color: #800000; ">td</span><span style="color: #0000FF;
">></span></pre>
+ </li>
+ <li>In the form view when displaying an input
control for the field:<pre><span style="color: #0000FF; "><</span><span
style="color: #800000; ">s:textfield </span><span style="color: #FF0000;
">key</span><span style="color: #0000FF; ">="<%=
EMPLOYEES.LASTNAME.getName() %>"</span><span style="color: #FF0000; ">
size</span><span style="color: #0000FF; ">="40"</span><span
style="color: #FF0000; ">
+ required</span><span style="color: #0000FF;
">="true"</span><span style="color: #0000FF; ">/></span></pre>
+ or again simpler using
Empire-Struts2-Extensions:<pre><span style="color: #0000FF; "><</span><span
style="color: #800000; ">e:control </span><span style="color: #FF0000;
">column</span><span style="color: #0000FF; ">="<%= EMPLOYEES.LASTNAME
%>"</span><span style="color: #FF0000; "> </span><span style="color:
#0000FF; ">/></span></pre>
+ </li>
+ </ol>
+ <p> With our unique Empire-Struts2-Extensions we also
address the issue of form data validation in
+ order to abolish the need for redundant and
unsafe XML validation files. The same can be done
+ for other applications frameworks â weâre
waiting for your contribution.</p>
+
+ <h1>Summary</h1>
+ <p> With Empire-db we proclaim the principle of
string-free coding by using object references rather
+ than string literals for both query definition
and metadata access and from the persistence layer
+ up to the presentation
+ layer. In order to make this possible a
consistent way to address properties and their meta information
+ is required that goes beyond the requirements
of data persistence. Empire-dbâs
+ object model schema definition in conjunction with its
data and metadata
+ interfaces provides such a mechanism. The
result is unprecedented compile-time safety leading to reduced
+ cost of testing and maintenance. </p>
+ <!-- #EndEditable --></div>
+
+ <div id="nav">
+ <hr />
+ <div id="nav_prev">
+ <a id="prev" href=""><img
src="../images/prev.gif" alt="" /> Previous Page</a>
+
+ </div>
+ <div id="nav_next">
+
+ <a id="next" href="">Next Page <img
src="../images/next.gif" alt="" /></a>
+ </div>
+ <div style="clear: both;"></div>
+ </div>
+
+ <script type="text/javascript">
+ /* <![CDATA[ */
+ if( ( typeof(prev_page) == "undefined" ||
prev_page == "" ) &&
+ ( typeof(next_page) == "undefined" ||
next_page == "" ) )
+ {
+ $( 'nav' ).hide();
+ }
+ else
+ {
+ if( typeof(prev_page) != "undefined" &&
prev_page != "" ) {
+ $( 'prev' ).href = prev_page;
+ $( 'prev' ).show();
+ }
+ else {
+ $( 'prev' ).hide();
+ }
+
+ if( typeof(next_page) != "undefined" &&
next_page !="" ) {
+ $( 'next' ).href = next_page;
+ $( 'next' ).show();
+ }
+ else {
+ $( 'next' ).hide();
+ }
+ }
+ /* ]]> */
+ </script>
+
+ </div>
+
+ </div>
+
+ <!-- Footer -->
+ <div id="footer">
+ <div class="cr"><small>Copyright © 2008-2021, The Apache
Software Foundation</small></div>
+ <div class="tm"><small>Apache Empire-db, Empire-db, Apache, the
Apache feather logo, and the Apache Empire-db project logo are trademarks of
The Apache Software Foundation</small></div>
+ </div>
+
+</div>
+
+</body>
+<!-- #EndTemplate -->
+</html>
\ No newline at end of file
Propchange: empire-db/site/legacy/empiredb/stringfree.htm
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: empire-db/site/legacy/images/Kopie von background.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/Kopie%20von%20background.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/Kopie von background.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/answer.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/answer.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/answer.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/asflink.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/asflink.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/asflink.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/background.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/background.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/background.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/background_red.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/background_red.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/background_red.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/bg.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/bg.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/bg.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/diagrams/dao_pattern.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/diagrams/dao_pattern.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/diagrams/dao_pattern.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/diagrams/empire-data-interfaces.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/diagrams/empire-data-interfaces.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/diagrams/empire-data-interfaces.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/diagrams/empire-db-class-chart.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/diagrams/empire-db-class-chart.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/diagrams/empire-db-class-chart.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/diagrams/function_of_input_control.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/diagrams/function_of_input_control.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/diagrams/function_of_input_control.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/diagrams/struts2-empire.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/diagrams/struts2-empire.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/diagrams/struts2-empire.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/diagrams/struts2-traditional.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/diagrams/struts2-traditional.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/diagrams/struts2-traditional.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/email.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/email.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/email.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/expand.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/expand.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/expand.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/key.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/key.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/key.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/logos/empire-db-logo.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/logos/empire-db-logo.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/logos/empire-db-logo.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/logos/feather-small.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/logos/feather-small.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/logos/feather-small.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/mail/empire-bugs.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/mail/empire-bugs.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/mail/empire-bugs.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/mail/empire-comment.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/mail/empire-comment.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/mail/empire-comment.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/mail/empire-contribute.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/mail/empire-contribute.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/mail/empire-contribute.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/mail/empire-support.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/mail/empire-support.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/mail/empire-support.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/menu/menu_main.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/menu/menu_main.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/menu/menu_main.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/menu/menu_main_current.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/menu/menu_main_current.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/menu/menu_main_current.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/menu/menu_sub.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/menu/menu_sub.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/menu/menu_sub.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/menu/menu_sub_current.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/menu/menu_sub_current.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/menu/menu_sub_current.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/next.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/next.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/next.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/prev.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/prev.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/prev.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: empire-db/site/legacy/images/question.gif
URL:
http://svn.apache.org/viewvc/empire-db/site/legacy/images/question.gif?rev=1898936&view=auto
==============================================================================
Binary file - no diff available.
Propchange: empire-db/site/legacy/images/question.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream