@MappedSuperclass и @OneToMany

Мне нужна ассоциация @OneToMany от страны к суперклассу Place (@MappedSuperclass). Он может быть двунаправленным. Мне нужно что-то вроде @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;
    }
}

Страна:

@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

Без @JoinColunm есть исключение:

Вызвано: org.hibernate.AnnotationException: @Any требует явного @JoinColumn(s): tour.spring.bc.model.vo.Country.places

В таблице «Город и регион» есть внешний ключ для таблицы «Страна» (Region.country_id, City.country_id), что нормально. Но мне НЕ нужен внешний ключ в таблице Country для таблиц Region и City, поэтому мне не нужен @JoinColum.

Что я могу сделать?


person LancerX    schedule 22.01.2011    source источник


Ответы (1)


@Any здесь не имеет смысла, так как внешний ключ находится на стороне Places и, следовательно, ему не нужен дополнительный метастолбец.

Я не уверен, можно ли создать полиморфную связь с @MappedSuperclass. Однако вы можете попытаться объявить Place как @Entity @Inheritance(InheritanceType.TABLE_PER_CLASS), это должно создать ту же схему базы данных и разрешить полиморфные отношения.

person axtavt    schedule 22.01.2011
comment
Однако в схеме базы данных есть тонкое, но важное отличие. С @MappedSuperclass каждый из конкретных подклассов Place может иметь свой собственный генератор идентификаторов, тогда как с @Inheritance(InheritanceType.TABLE_PER_CLASS) все они должны иметь одинаковые. Например, экземпляры двух разных подтипов Place в первом случае могут иметь один и тот же идентификационный номер, а во втором — нет. - person DavidDuwaer; 17.01.2018