@MappedSuperclass и @OneToMany - PullRequest
       34

@MappedSuperclass и @OneToMany

4 голосов
/ 22 января 2011

Диаграмма UML

Мне нужно связать 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 есть исключение

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

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

Я часто искал решение, но, похоже, нет хорошего решения.

1 Ответ

5 голосов
/ 22 января 2011

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

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

...