7

I need association @OneToMany from Country to superclass Place (@MappedSuperclass). It could be bidirectional. I would need something like @OneToAny.

@MappedSuperclass
public class Place {

    private String name;
    private Country country;

    @Column
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ManyToOne
    @JoinColumn(name="country_id")
    public Country getCountry() {
        return country;
    }

    public void setCountry(Country country) {
        this.country = country;
    }
}

Country:

@Entity
   public class Country {
   private long id;
   private String name;
   private List<Place> places;

   @Any(metaColumn = @Column(name = "place_type"), fetch = FetchType.EAGER)
   @AnyMetaDef(idType = "integer", metaType = "string", metaValues = {
         @MetaValue(value = "C", targetEntity = City.class),
         @MetaValue(value = "R", targetEntity = Region.class) })
   @Cascade({ org.hibernate.annotations.CascadeType.ALL })
   //@JoinColumn(name="unnecessary") 
   //@OneToMany(mappedBy="country")  // if this, NullPointerException...
   public List<Place> getPlaces() {
      return places;
   }
//and rest of class

Without @JoinColunm there is an exception:

Caused by: org.hibernate.AnnotationException: @Any requires an explicit @JoinColumn(s): tour.spring.bc.model.vo.Country.places

In table City and Region is foreign key to table Country (Region.country_id, City.country_id) which is ok. But I do NOT need foreign key in table Country to tables Region and City so I don't need @JoinColum.

What can I do?

Willi Mentzel
  • 27,862
  • 20
  • 113
  • 121
LancerX
  • 1,211
  • 7
  • 23
  • 40

1 Answers1

6

@Any doesn't make sense here since foreign key is at the Places side and therefore it doesn't need additional meta column.

I'm not sure if it's possible to create a polymorphic relationship to @MappedSuperclass. However, you can try to declare Place as @Entity @Inheritance(InheritanceType.TABLE_PER_CLASS), it should produce the same database schema and allow polymorpic relationship.

axtavt
  • 239,438
  • 41
  • 511
  • 482
  • 2
    There is a subtle but important difference in the database schema though. With `@MappedSuperclass`, each of the concrete subclasses of `Place` can have its own ID generator, whereas with `@Inheritance(InheritanceType.TABLE_PER_CLASS)`, they all have to have the same. For example, instances of two different subtypes of `Place` can in the former case have the same ID number, but in the latter case they can't. – DavidDuwaer Jan 17 '18 at 10:23