Closed rbygrave closed 5 years ago
@rbygrave I have a use case where some classes / tables are merely serve as join tables with inheritance type information. Can you indicate how these should be handled? As they only define an identifier and a discriminator value, they can't be saved with the ID set.
I can create a new issue if that's preferred.
Background:
My data model is graph like with inheritance trees for Vertex
and Edge
. For example, the Vertex
class is along the lines of:
@Entity
@Inheritance
public abstract class Vertex {
@Id
private UUID id;
public Vertex() {
this(UUID.randomUUID());
}
public Vertex(UUID id) {
this.id = id;
}
public UUID getId() {
return id;
}
}
The create statement for the vertex table is:
create table vertex (
type varchar(31) not null,
id uuid not null,
constraint pk_vertex primary key (id)
);
Note that all classes inheriting from Vertex
do add properties, but they are all 'multi-valued' and are modelled at the Ebean level as @OneToMany
associations.
When saving a vertex with only an ID set, it doesn't get saved because it is marked as a reference bean; e.g.:
Person person = new Person(UUID.randomUUID()); // Person extends Vertex
database.save(person);
assertThat(database.find(Vertex.class, person.getId())).isEqualTo(person); // fails
assertThat(database.find(Person.class, person.getId())).isEqualTo(person); // and this then obviously also fails
The 'culprit' for inserts seems to be in DefaultPersister.insert(EntityBean, Transaction)`:
public void insert(EntityBean bean, Transaction t) {
PersistRequestBean<?> req = createRequest(bean, t, PersistRequest.Type.INSERT);
if (req.isReference()) {
// skip insert on reference bean
return;
}
...
Note that all classes inheriting from Vertex do add properties, but they are all 'multi-valued' and are modelled at the Ebean level as @OneToMany associations.
Ah right, I see.
Ok, we need to log this as a new issue (related for sure) ... and I'm thinking that Ebean would need to change to detect this case where there are only ToMany properties ... and for those types of beans we can't treat "new beans with only id property" as reference beans but instead use the bean state.
Can you log a new issue with the same details you have posted here?
Thanks, Rob. Share the love, give Ebean a github star.
Steps to reproduce
Alternate steps to reproduce
Test case provided with 3 levels of OneToOne relationships. The lowest level (ClassC now called OtoLevelC) is a reference bean ... and when that is saved we see the error.