[odb-users] Object reference in composite value type

Harald Frostel Harald.Frostel at jku.at
Mon Jan 27 04:16:11 EST 2014


Hi!
 
Is there a way to use a shared_ptr/lazy_shared_ptr in a composite
value?
 
In our database we use composite primary keys quite a lot. In most
cases we have collections of "child" objects that belong to a "parent"
object (1-n relationship). The child’s primary key consists of the
parent primary key and a child id that is unique within one parent.
 
Example:
 
Parent Table:
ID Values
1 …
2 …
 
PRIMARY KEY("ID"),
 
Child Table:
ParentID ChildID Values
1  1  …
1  2  …
1  3  …
2  1  …
 
PRIMARY KEY("ParentID","ChildID"),
FOREIGN KEY ("ParentID") REFERENCES "ParentTable" ("ID")
 
The straight forward way for the child object would be to create a
composite value that consists of a reference to a parent object and a
child id, and use this as the id in the child object.
 
#pragma db value
struct ChildCompositePrimaryKey {
private:
friend class odb::access;
 
public:
 
#pragma db column("ParentID") not_null
std::shared_ptr<ParentObject> parent__;
 
#pragma db column("ChildID") not_null
int child_id_;
 
};
 
But when this is compiled with the odb compiler, I get an error:
error: object pointer member 'parent_' in a composite value type that
is used as an object id.
 
The workaround right now is to use custom set/get methods (replace the
reference in the composite value by an int parent_id_ and create a
lazy_pointer of this parent id during loading) for the child object id
but than, in the generate schema the foreign key relation is lost.
 
Is there a way to solve this differently (without changing the schema
of the database)?
 
Regards,
Harald
 

 
****************************************************
Dipl.-Ing. Harald Frostel
Department of Computational Perception
Johannes Kepler University Linz
Altenberger Strasse 69
A-4040 Linz, Austria	    
 
Tel:  +43 732 2468 1521
Fax:  +43 732 2468 1520
Mail: harald.frostel at jku.at
http://www.cp.jku.at/people/frostel
****************************************************


More information about the odb-users mailing list