Hello.

I ran into this problem, and I'm not sure what the right answer is.
Consider just two entities (I've gutted them to the pieces that are
relevant, I tried this on corresponding classes in
org.apache.openjpa.persistence.relations package,
openjpa-persistence-jdbc module):

public class MapKeyParent implements Serializable {
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch =
FetchType.EAGER)
    @MapKey(name = "mapKey")
    private Map<String, MapKeyChild> children;
}
public class MapKeyChild implements Serializable {
    @ManyToOne @JoinColumn private MapKeyParent parent;
}

Creating the entities separately, and flushing them causes an NPE
(https://pastebin.com/StN604Hg):

        MapKeyParent parent = new MapKeyParent();
        MapKeyChild child = new MapKeyChild();
        child.setParent(parent);
        em.persist(parent);
        em.persist(child);
        em.flush();

The NPE is obviously because parent.children is null. But should this
be considered a problem? Is there a rule that says that I have to
reference children in the corresponding collections/maps (I never had
to do it before)? If it is not required, how can this be fixed?

I can't quite understand what is the point of
RelationFieldStrategy.setMapKey() method. It seems that it may not do
well if map, or the key is null. Also, I'm rather bothered by the fact
that map key is searched in the map by iterating over the map values,
and even it's not needed (i.e. when key is not embedded and strategy
is not HandlerRelationMapTableFieldStrategy).

An obvious "fix" for me, is to either add the object to children map,
or at least have the map empty by the time flush() is called. I don't
see any adverse effects on sending the data to the storage.

Thank you,
  Pawel.

Reply via email to