NAME
Persistence::Meta::XML - Persistence meta object xml injection
SYNOPSIS
use Persistence::Meta::XML;
my $meta = Persistence::Meta::XML->new(persistence_dir => 'meta/');
my $entity_manager = $meta->inject('my_persistence.xml');
#or
# $meta->inject('my_persistence.xml');
# my $entity_manager = Persistence::Entity::Manager->manager('manager_name');
DESCRIPTION
Loads xml files that containt meta persistence definition.
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence name="test" connection_name="test" >
<entities>
<entity_file file="emp.xml" />
<entity_file file="dept.xml" />
</entities>
<mapping_rules>
<orm_file file="Employee.xml" />
<orm_file file="Department.xml" />
</mapping_rules>
</persistence>
emp.xml
<?xml version="1.0" encoding="UTF-8"?>
<entity name="emp" alias="e">
<primary_key>empno</primary_key>
<columns>
<column name="empno" />
<column name="ename" unique="1" />
<column name="sal" />
<column name="job" />
<column name="deptno" />
</columns>
<subquery_columns>
<subquery_column name="dname" entity="dept" />
</subquery_columns>
</entity>
dept.xml
<?xml version="1.0" encoding="UTF-8"?>
<entity name="dept" alias="d">
<primary_key>deptno</primary_key>
<columns>
<column name="deptno" />
<column name="dname" unique="1" />
<column name="loc" />
</columns>
<to_many_relationships>
<relationship target_entity="emp" order_by="deptno, empno">
<join_column>deptno</join_column>
</relationship>
</to_many_relationships>
</entity>
Employee.xml
<?xml version="1.0" encoding="UTF-8"?>
<orm entity="emp" class="Employee" >
<column name="empno" attribute="id" />
<column name="ename" attribute="name" />
<column name="job" attribute="job" />
<column name="dname" attribute="dept_name" />
<to_one_relationship name="dept" attribute="dept" fetch_method="EAGER" cascade="ALL"/>
</orm>
Department.xml
<?xml version="1.0" encoding="UTF-8"?>
<orm entity="dept" class="Department" >
<column name="deptno" attribute="id" />
<column name="dname" attribute="name" />
<column name="loc" attribute="location" />
<one_to_many_relationship name="emp" attribute="employees" fetch_method="EAGER" cascade="ALL"/>
</orm>
package Employee;
use Abstract::Meta::Class ':all';
has '$.id';
has '$.name';
has '$.job';
has '$.dept_name';
has '$.dept' => (associated_class => 'Department');
package Department;
use Abstract::Meta::Class ':all';
has '$.id';
has '$.name';
has '$.location';
has '@.employees' => (associated_class => 'Employee');
my $meta = Persistence::Meta::XML->new(persistence_dir => $dir);
my $entity_manager = $meta->inject('persistence.xml');
my ($dept) = $entity_manager->find(dept => 'Department', name => 'dept3');
my $enp = Employee->new(id => 88, name => 'emp88');
$enp->set_dept(Department->new(id => 99, name => 'd99'));
$entity_manager->insert($enp);
EXPORT
None
ATTRIBUTES
- entities
- _entities_subquery_columns
- _entities_to_many_relationship
- _entities_to_one_relationship
- cache_dir
-
Containts cache directory.
- use_cache
-
Flag that indicates if use cache.
- persistence_dir
-
Contains directory of xml files that contain persistence object definition.
METHODS
- inject
-
Injects persistence xml definition. Takes xml file definition
my $meta = Persistence::Meta::XML->new(persistence_dir => $dir); my $entity_manager = $meta->inject('persistence.xml');
- persistence_xml_handler
-
Retunds xml handlers that will transform the persistence xml into objects. Persistence node is mapped to the Persistence::Entity::Manager;
<!ELEMENT persistence (entities+,mapping_rules*)> <!ATTLIST persistence name #REQUIRED> <!ATTLIST persistence connection_name #REQUIRED> <!ELEMENT entities (entity_file+)> <!ELEMENT entity_file (filter_condition_value+ .dml_filter_value) > <!ATTLIST entity_file file id order_index> <!ELEMENT mapping_rules (orm_file+)> <!ATTLIST mapping_rules file> <?xml version='1.0' encoding='UTF-8'?> <persistence name="test" connection_name="test" > <entities> <entity_file file="emp.xml" /> <entity_file file="dept.xml" /> </entities> <mapping_rules> <orm_file file="Employee" /> </mapping_rules> </persistence>
- add_xml_persistence_handlers
-
Adds persistence xml handlers/ Takes Simple::SAX::Serializer object as parameter.
- load_persistence_object
-
Loads persistence object. Takes entity manager object, array ref of the entity files, array ref of the ORM files.
- orm_xml_handler
-
<!ELEMENT orm (column+, to_one_relationship*, one_to_many_relationship*, many_to_many_relationship*) <!ATTRLIST orm class entity> <!ELEMENT column> <!ATTRLIST column name attribute> <!ELEMENT to_one_relationship> <!ATTRLIST to_one_relationship name attribute #REQUIRED> <!ATTRLIST to_one_relationship fetch_method (LAZY|EAGER) "LAZY"> <!ATTRLIST to_one_relationship cascade (NONE|ALL|ON_INSERT|ON_UPDATE|ON_DELETE) "NONE"> <orm entity="emp" class="Employee" > <column name="empno" attribute="id" /> <column name="ename" attribute="name" /> <column name="job" attribute="job" /> <to_one_relationship name="dept" attribute="depts" fetch_method="LAZY" cascade="ALL"> </orm> many_to_many 'project' => ( attribute => has('%.projects' => (associated_class => 'Project'), index_by => 'name'), join_entity_name => 'emp_project', fetch_method => LAZY, cascade => ALL, );
- orm_xml_handler
-
Retunds xml handlers that will transform the orm xml into Persistence::ORM object
- add_orm_xml_handlers
-
Adds orm xml handler to Simple::SAX::Serializer object.
- create_orm_mapping
-
Creates orm mappings. Takes
- _add_one_to_many_relationship
- _add_to_many_to_many_relationship
- _add_to_one_relationship
- _add_relationship_parameters
- entity_xml_handler
-
Retunds xml handlers that will transform the enity xml into Persistence::Entity
<!ELEMENT entity (primary_key*, indexes?, columns?, subquery_columns?, filter_condition_value+ .dml_filter_value+, to_one_relationships? to_many_relationships?, value_generators*)> <!ATTLIST entity id name alias unique_expression query_from schema order_index> <!ELEMENT primary_key (#PCDATA)> <!ELEMENT indexes (index+)> <!ELEMENT index (index_columns+)> <!ATTLIST index name hint> <!ELEMENT index_columns (#PCDATA)> <!ELEMENT columns (column+) > <!ELEMENT subquery_columns (subquery_column+)> <!ELEMENT subquery_column> <!ATTLIST subquery_column entity name> <!ELEMENT column> <!ATTLIST column id name unique expression case_sensitive queryable insertable updatable> <!ELEMENT filter_condition_values (#PCDATA)> <!ATTLIST filter_condition_values name #REQUIRED> <!ELEMENT dml_filter_values (#PCDATA)> <!ATTLIST dml_filter_values name #REQUIRED> <!ELEMENT to_one_relationships (relationship+)> <!ELEMENT to_many_relationships (relationship+)> <!ELEMENT relationship (join_columns*, condition?)> <!ATTLIST relationship name target_entity order_by> <!ELEMENT join_columns (#PCDATA)> <!ELEMENT condition (condition+) > <!ATTLIST condition operand1 operator operand2 relation> <!ELEMENT value_generators (#PCDATA)> For instnace. <?xml version="1.0" encoding="UTF-8"?> <entity name="emp" alias="e"> <primary_key>empno</primary_key> <indexes> <index name="emp_idx_empno" hint="INDEX_ASC(e emp_idx_empno)"> <index_column>ename</index_column> </index> <index name="emp_idx_ename"> <index_column>empno</index_column> </index> </indexes> <columns> <column name="empno" /> <column name="ename" /> </columns> <subquery_columns> <subquery_column name="dname" entity_id="dept" /> </subquery_columns> <to_one_relationships> <relationship target_entity="dept"> <join_column>deptno</join_column> </relationship> </to_one_relationships> </entity>
- add_entity_xml_handlers
-
Adds entity xml handler to the Simple::SAX::Serializer object.
- _initialise_subquery_columns
-
Initialise subquery columns
- _initialise_to_one_relationship
-
Initialise to one relationships
- _initialise_to_many_relationship
-
Initialise to manye relationships
- _initialise_relationships
-
Initialises relationshsips Takes relationship type as parameters. Allowed value: 'to_one_relationships', 'to_many_relationships'
- _relationship
-
Returns the relationship object. Takes hash_ref, that will be transformed to the new object parameters.
- _parse_condition
-
Parses condition object to replacase ant occurence of <entity>.<column> to column object.
- has_column
- entity_column
-
Returns entity column
TOO DO
Add caching of xml.
SEE ALSO
COPYRIGHT AND LICENSE
The Persistence::Meta::Xml module is free software. You may distribute under the terms of either the GNU General Public License or the Artistic License, as specified in the Perl README file.
AUTHOR
Adrian Witas,adrian@webapp.strefa.pl