The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Persistence::Manual::ValueGenerator - The primary key value generator.

INTRODUCTION

This manual explains how to generate the primary key for your entity.

Use can use value generator that based on database table - Persistence::ValueGenerator::TableGenerator or you can use database sequenc - Persistence::ValueGenerator::SequenceGenerator

At first stage toy have to generate value generator, then at the second stage add generator association to entity definition.

VALUE_GENERATOR

Lets defined value generator to the following table:

   CREATE emp(empno number, ename varchar2(100), deptno number);

Table generator

   # for that instance you need to add the following table
   # CREATE TABLE seq_generator(pk_column VARCHAR2(30), value_column double)

   use Persistence::ValueGenerator::TableGenerator ':all';

   table_generator 'pk_generator' => (
        entity_manager_name      => $entity_manager_name,
        table                    => 'primary_key_generator',
        schema                   => '',
        primary_key_column_name  => 'pk_column',
        primary_key_column_value => 'empno',
        value_column             => 'value_column',
        allocation_size          =>  20,
   );
table

Table name of the generator table.

primary_key_column_name

Name of the column that identifies the specific table primary key you are generating for.

primary_key_column_value

Used to match up with the primary key you are generating for.

value_column

Specifies the name of the column that will hold the counter for the generated primary key.

allocation_size

Defined how much the counter will be incremented when entity queries the table for a new value, This feature is to cache subsequent sequence's values so that it doesn't have to go to the database every time it needs a new ID.

Sequence generator

    # for that instance you need to add the following sequence
    #CREATE SEQUENCE emp_seq;

    use Persistence::ValueGenerator::SequenceGenerator ':all';

    sequence_generator 'emp_gen' => (
        entity_manager_name  => $entity_manager_name,
        sequence_name        => 'cust_seq',
        allocation_size      =>  1,
    );

ENTITY

After defining generator the only thing that need be done is to add value_generator property to the entity definition. In our case we have to add hash ref where the key represents primary key colunm, value - name of value generator.

    my $emp_entity = Persistence::Entity->new(
        name             => 'emp',
        alias            => 'ep',
        primary_key      => ['empno'],
        columns          => [
            sql_column(name => 'empno'),
            sql_column(name => 'ename', unique => 1),
        ],
        value_generators => {empno => 'emp_gen'},
    );

XML Mapping File

If you do not want to interact directly with value generator or Entity definition you can alternatively use an XML mapping file to declare this metadata.

XML injection of the persistence metadata.

    use Persistence::Meta::XML;
    my $meta = Persistence::Meta::XML->new(persistence_dir => 'meta/');
    $meta->inject('persistence.xml');

XML definitions:

    persistence.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence name="test"  connection_name="test" >
        <entities>
            <entity_file  file="emp.xml"  />
        </entities>
        <value_generators>
            <sequence_generator name="emp_seq" sequence_name="emp_seq" allocation_size="1" />
            <table_generator name="pk_generator" table="seq_generator" primary_key_column_name="pk_column" primary_key_column_value="empno" value_column="value_column" allocation_size="20" />
        </value_generators>
    </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" />
        </columns>
        <value_generator column="empno">pk_generator</value_generator>
    </entity>