AlexS
AlexS

Reputation: 5345

How to model a bidirectional One2One-relation using greendao?

I have 2 entities, for example car and engine.

Each car has one engine (at least in this model :) ), but not every engine is built into a car. So I want the following table-structure:

+------------------------------------+
|CAR                                 |
+------------------------------------+
|id_car     INTEGER,PK,AUTOINCREMENT |
|id_engine  INTEGER,FK               |
+------------------------------------+

+------------------------------------+
|ENGINE                              |
+------------------------------------+
|id_engine  INTEGER,PK,AUTOINCREMENT |
+------------------------------------+

(Of course there are much more columns. In fact I have two entities with about 15 columns each. But let's keep it simple.)

This can be modeled like this:

engine = schema.addEntity("Engine");
Property pkEngine = engine.addLongProperty("id_engine").primaryKey().autoincrement().getProperty();

car = schema.addEntity("Car");
car.addLongProperty("id_car").primaryKey().autoincrement();
Property fkEngine = car.addLongProperty("id_engine").getProperty();
car.addToOne(engine, fkEngine);

But I want to be able to query car from engine and engine from car, with getters on the corresponding entity-objects. Therefor I added:

engine.addToOneWithoutProperty("Car", car, "id_car");

I then have all the getters I want, but my tables look like this:

    +------------------------------------+
|CAR                                 |
+------------------------------------+
|id_car     INTEGER,PK,AUTOINCREMENT |
|id_engine  INTEGER,FK               |
+------------------------------------+

+------------------------------------+
|ENGINE                              |
+------------------------------------+
|id_engine  INTEGER,PK,AUTOINCREMENT |
|id_car     INTEGER                  |
+------------------------------------+

If I use the following statments for insert the fk-columns are inconsisent, as CAR.id_engine is NULL, which leeds to exceptions using the getter engine.getCar().

Engine engine = new Engine();
mEngineDao.insert(engine);
Car car = new Car();
car.setEngine(engine);
engine.setCar(car);
mCarDao.insert(car);
engine.update();

Does anyone have suggestions how to build a One2One-Relation using greendao, so that there is only one foreign-key-column and getters in each entity?

---UPDATE---

It seems like addToOneWithoutProperty() doesn't work correctly. I can't find a section in the generated void bindValues(SQLiteStatement stmt, Car entity) that cares about the column id_engine.

Upvotes: 0

Views: 915

Answers (2)

AlexS
AlexS

Reputation: 5345

Bidirectional one-to-one-mappings seem to be not supported at the moment.

Since I don't want redundant data in my database (to avoid inconsistencies) I decided to work with a simple to-one mapping for now. The other reason for this decicion is that I don't know if there will be ring-dependencies causing stack-overflows or other things.

Upvotes: 1

Daniel S. Fowler
Daniel S. Fowler

Reputation: 2033

I suggest a car-engine table to hold the relationship:

+------------------------------------+
|CAR                                 |
+------------------------------------+
|id_car     INTEGER,PK,AUTOINCREMENT |
+------------------------------------+

+------------------------------------+
|ENGINE                              |
+------------------------------------+
|id_engine  INTEGER,PK,AUTOINCREMENT |
+------------------------------------+

+------------------------------------+
|CARENGINE                           |
+------------------------------------+
|id_car     INTEGER,FK               |
|id_engine  INTEGER,FK               |
+------------------------------------+

CARENGINE uses a compound key, no experience of greenDAO so do not know if it supports composite keys (add a PK to CARENGINE if not).

Upvotes: 0

Related Questions