Hibernate: @UniqueConstraint с полем @ManyToOne? - PullRequest
8 голосов
/ 18 июня 2010

Используя следующий код:

@Entity 
@Table(uniqueConstraints=[@UniqueConstraint(columnNames=["account","name"])])
class Friend {
  @Id @GeneratedValue(strategy=GenerationType.AUTO)
  public Long id
  @ManyToOne
  public Account account
  public String href
  public String name
}

Я получаю следующую ошибку:

org.hibernate.AnnotationException: Unable to create unique key constraint (account, name) on table Friend: account not found

Похоже, это связано с ограничением @ManyToOne, которое, я думаю, фактически создает отдельную UniqueConstraint ???

В любом случае, если я уберу это, жалоб на UniqueConstraint нет, но есть еще одна ошибка, из-за которой я считаю, что ее следует оставить.

org.hibernate.MappingException: Could not determine type for: com.mksoft.fbautomate.domain.Account, at table: Friend, for columns: [org.hibernate.mapping.Column(account)]

Любой намек на то, как я могу создать такое желаемое ограничение (то есть, что каждая комбинация учетной записи и имени встречается только один раз ???)

Спасибо!

Misha

1 Ответ

12 голосов
/ 30 сентября 2010

Решение:

@Entity 
@Table(uniqueConstraints=[@UniqueConstraint(columnNames=["myaccountcolum","name"])])
class Friend {
  @Id @GeneratedValue(strategy=GenerationType.AUTO)
  public Long id
  @ManyToOne
  @JoinColumn(name="myaccountcolum")
  public Account account
  public String href
  public String name
}

Пояснение: Имя столбца для @ManyToOne в сгенерированной таблице, вероятно, будет выглядеть как account_id вместо account. @UniqueConstraint ожидает точное имя столбца, а не имя, которое вы используете в своем классе. Чтобы убедиться, что это просто работает, присвойте этому столбцу определенное имя с @JoinColumn и убедитесь, что это же имя используется в вашем UniqueConstraint.

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