Hibernate 3.6.7: проблема с @ANY и Foreign-Key - PullRequest
3 голосов
/ 25 августа 2011

У меня есть объекты "Пользователь" и "Клиент":

@Entity
@Table(name = "USR_USER")
public class User extends PersistentObject {

   [...]

   @Any(metaColumn = @Column(name = "USR_OWNERTYPE"))
   @AnyMetaDef(idType = "long", metaType = "string", metaValues = {
         @MetaValue(targetEntity = Customer.class, value = "CST"),
         @MetaValue(targetEntity = Client.class, value = "CLT") })
   @JoinColumn(name = "USR_OWNERID")
   private PersistentObject owner;
}

@Entity
@Table(name = "CST_CUSTOMER")
public class Customer extends PersistentObject {

   @Id
   @GeneratedValue
   @Column(name="CST_ID")
   private long id;

   [...]

   // @OneToMany(mappedBy = "owner")
   private transient Set<User> users;
}

Запустив это (используя пружину), я получил следующее исключение:

Caused by: org.hibernate.MappingException: Foreign key (FK35B91BB65D577CEF:USR_USER [USR_OWNERTYPE,USR_OWNERID])) must have same number of columns as the referenced primary key (CST_CUSTOMER [CST_ID])

Я не понимаю этого, потому что я сопоставил класс "Customer" в @AnyMetaDef (в "User") с константой "CST".

Что я делаю не так?

Заранее спасибо за любую помощь Thomas

1 Ответ

1 голос
/ 25 августа 2011

"Невозможно указать ограничение внешнего ключа для такого рода ассоциации." - http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-types-anymapping

Редактировать : то, что вы хотели бы для противоположного конца вашего @Any, это @OneToAny, а этого не существует. Возможно, вы используете отображение @Any в неподходящем месте. Снова из документов : "Это не обычный способ отображения полиморфных ассоциаций, и вы должны использовать его только в особых случаях. Например, для журналов аудита, данных сеанса пользователя и т. Д."

Внимательно посмотрите на отображение наследования и посмотрите, не является ли один из них более подходящим способом для отображения ваших отношений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...