2015-07-16 3 views
1

Я играю с RoseDB :: Object на employees test dataset, и по какой-то причине я не могу получить отношения с внешним ключом ('department' и 'employee') до работа над объектом DeptEmp. (Структура классов ниже).Внешние методы отношения отношений отложены и никогда не создаются в RDBO

Когда я пытаюсь $e->dept_emp->[0]->department, я получаю:

Can't locate object method "department" via package "My::FakeEmployees::DeptEmp" 

Methods for the following relationships and foreign keys were deferred and 
then never actually created in the class My::FakeEmployees::DeptEmp. 

TYPE   NAME 
----   ---- 
Foreign Key  department 
Foreign Key  employee 

Я уверен, что у меня есть что-то настроить неправильно в моей классовой структуре, но что?

классовая структура (некоторые классы опущенные для ясности):

Я создал различные объекты с помощью инструкции в RDBO tutorial:

package My::FakeEmployees::Employee; 

use strict; 

use base qw(My::FakeEmployees::DB::Object); 

__PACKAGE__->meta->setup(
    table => 'employees', 

    columns => [ 
     emp_no  => { type => 'serial', not_null => 1 }, 
     birth_date => { type => 'date', not_null => 1 }, 
     first_name => { type => 'varchar', length => 14, not_null => 1 }, 
     last_name => { type => 'varchar', length => 16, not_null => 1 }, 
     gender  => { type => 'enum', check_in => [ 'M', 'F' ], not_null => 1 }, 
     hire_date => { type => 'date', not_null => 1 }, 
    ], 

    primary_key_columns => ['emp_no'], 
    'relationships'  => [ 
     'departments' => { 
      'type'  => 'many to many', 
      'map_class' => 'My::FakeEmployees::DeptEmp', 
     }, 
     'dept_emp' => { 
      'type' => 'one to many', 
      'class' => 'My::FakeEmployees::DeptEmp', 
      'column_map' => { 'emp_no' => 'emp_no' }, 
     }, 
     'dept_manager' => { 
      'type' => 'one to many', 
      'class' => 'My::FakeEmployees::DeptManager', 
      'column_map' => { 'emp_no' => 'emp_no' }, 
     }, 
     'salaries' => { 
      'type' => 'one to many', 
      'class' => 'My::FakeEmployees::Salary', 
      'column_map' => { 'emp_no' => 'emp_no' }, 
     }, 
     'titles' => { 
      'type' => 'one to many', 
      'class' => 'My::FakeEmployees::Title', 
      'column_map' => { 'emp_no' => 'emp_no' }, 
     }, 
    ], 
); 

__PACKAGE__->meta->make_manager_class('employees'); 

1; 

package My::FakeEmployees::DeptEmp; 

use strict; 

use base qw(My::FakeEmployees::DB::Object); 

__PACKAGE__->meta->setup(
    table => 'dept_emp', 

    columns => [ 
     dept_no => { type => 'character', not_null => 1 }, 
     emp_no => { type => 'integer', not_null => 1 }, 
     from_date => { type => 'date' }, 
     to_date => { type => 'date' }, 
    ], 

    primary_key_columns => [ 'emp_no', 'dept_no' ], 

    foreign_keys => [ 
     department => { 
      class  => 'My::FakeEmployees::Departments', 
      key_columns => { dept_no => 'dept_no' }, 
     }, 

     employee => { 
      class  => 'My::FakeEmployees::Employees', 
      key_columns => { emp_no => 'emp_no' }, 
     }, 
    ], 
); 
__PACKAGE__->meta->make_manager_class('dept_emp'); 


1; 

package My::FakeEmployees::Department; 

use strict; 

use base qw(My::FakeEmployees::DB::Object); 

__PACKAGE__->meta->setup(
    table => 'departments', 

    columns => [ 
     dept_no => { type => 'character', length => 4, not_null => 1 }, 
     dept_name => { type => 'varchar', length => 40, not_null => 1 }, 
    ], 

    primary_key_columns => ['dept_no'], 

    unique_key => ['dept_name'], 

    'relationships'  => [ 
     'employees' => { 
      'type'  => 'many to many', 
      'map_class' => 'My::FakeEmployees::DeptEmp', 
     }, 
    ], 
); 
__PACKAGE__->meta->make_manager_class('departments'); 

1; 

ответ

1

Ваш внешний ключ имеет опечатка:

foreign_keys => [ 
    department => { 
     class  => 'My::FakeEmployees::Departments', 

Это должно быть «Отдел», а не «Отделы»

+0

Да, именно так. –

0

Это оказалось ошибкой в ​​моем коде. Эти строки в DeptEmp.pm:

foreign_keys => [ 
    department => { 
     class  => 'My::FakeEmployees::Departments', 
     key_columns => { dept_no => 'dept_no' }, 
    }, 

    employee => { 
     class  => 'My::FakeEmployees::Employees', 
     key_columns => { emp_no => 'emp_no' }, 
    }, 
], 

Неправильные имена классов. Это должно быть My :: FakeEmployees :: Сотрудник и My :: FakeEmployees :: Отдел. Сингулярный, а не множественный.