Hibernate ManyToOne ПРИСОЕДИНЯЙТЕСЬ к столбцу не-PK выдает «Плохое значение для типа int»

1

Прежде всего позвольте мне сделать мой сценарий понятным. Я использую hibernate 4.3, Postgresql 9.3 с весной MVC, и у меня есть обратные инженерные классы с использованием инструмента JBOSS.

Каждый раз, когда я выбираю данные с помощью HQL или session.get(), я получаю (SQL-запросы работают нормально). Причина: org.postgresql.util.PSQLException: Плохое значение для типа int: [email protected]

Классы сущностей,
Applicant.java

@Entity
@Table(name = "applicant", schema = "public", uniqueConstraints = { @UniqueConstraint(columnNames = "user_id"), @UniqueConstraint(columnNames = "email"), @UniqueConstraint(columnNames = "registration_id") })
public class Applicant implements java.io.Serializable
{
    @Id
    @Column(name = "application_id", unique = true, nullable = false, length = 7)
    private String applicationId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "email", unique = true, nullable = false)
    private Users usersByEmail;

     // setters and getters
}

и класса Users, у которого есть отношения @ManytOne с вышеуказанным классом.

@Entity
@Table(name = "users", schema = "public", uniqueConstraints = { @UniqueConstraint(columnNames = "email"), @UniqueConstraint(columnNames = "application_id") })
public class Users implements java.io.Serializable
{
    @Id
    @Column(name = "user_id", unique = true, nullable = false)
    private int userId;

    @Column(name = "email", unique = true, nullable = false, length = 100)
    private String email;

}

Теперь проверьте структуру схемы

CREATE TABLE users
(
  email character varying(100) NOT NULL,
  user_id integer NOT NULL,
  CONSTRAINT users_pk PRIMARY KEY (user_id),
  CONSTRAINT unique_email UNIQUE (email)
)

 CREATE TABLE applicant
(
  application_id character(7) NOT NULL,
  email character varying(100) NOT NULL,
  CONSTRAINT users_email_fk FOREIGN KEY (email)
  REFERENCES users (email) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT unique_applicant_email UNIQUE (email)
 )

[Edited] Я использую столбец join по электронной почте таблицы пользователя, который имеет ограничение Unique, но не он не PK (PK is user_id)
PS: Я не могу изменить структуру схемы db, у меня нет полномочий

Теги:
spring
hibernate
jpa

3 ответа

2
Лучший ответ

Вам нужно добавить referencedColumnName атрибут в @ManyToOne ассоциации:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "email", referencedColumnName = "email", unique = true, nullable = false)
private Users usersByEmail;
  • 0
    Спасибо товарищ. Наконец-то кто-то решил мою проблему :-)
  • 0
    Добро пожаловать.
1

Вы определили joinColumn как электронную почту, столбец EMAIL из таблицы вашего заявителя будет использоваться при создании объединений (которые являются значениями, хранящимися в varchar). Но соединения выполняются с помощью аннотированного поля @ID, которое для пользователя является userId, и оно числовое, поэтому вы получаете исключение.

Присоединение всегда по @ID, поле, joincolumn сообщает только, где оно должно храниться в объединенной или локальной таблице.

  • 0
    Эти классы создаются инструментом Hibernate, и я не могу изменить структуру БД (или структуру схемы), потому что это устаревшая система.
  • 0
    ну, вы должны изменить свои классы тогда. Вам нужно переместить идентификатор с идентификатора на электронную почту, иначе он не будет работать.
Показать ещё 4 комментария
0

вам нужно либо определить первичный ключ в базе данных (вместо нескольких уникальных полей), либо использовать reveng.xml, чтобы сообщить инструментам hibernate, что является истинным первичным ключом.

Вам нужно что-то вроде:

<table name="applicant"> 
 <primary-key>
  <key-column name="application_id"/>
 </primary-key>
</table>

вы можете увидеть подробности в документах по адресу: http://docs.jboss.org/tools/latest/en/hibernatetools/html/reverseengineering.html

  • 0
    пожалуйста, объясните мне это подробно.
  • 0
    Добавлен пример и ссылки на документы. надеюсь, это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню