Как я могу иметь 2 объекта одного типа в моем классе? - PullRequest
2 голосов
/ 06 марта 2012

У меня есть класс, который должен иметь 2 объекта одного типа.Я использую Hibernate, который создает мою схему базы данных на основе моих классов.

Атрибуты:

private User user;
private User keyAccountManager;

Getter / Setter:

@ManyToOne
@JoinColumn(name = "userId")
@ForeignKey(name = "license_users_fk")
public User getUser() {
    return user;
}

@ManyToOne
@JoinColumn(name = "userId")
@ForeignKey(name = "license_kam_fk")
public User getKeyAccountManager() {
    return keyAccountManager;
}

Если я делаю это каквот, я получаю эту ошибку:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: License column: userId (should be mapped with insert="false" update="false")
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:670)
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:692)
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:714)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:468)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:215)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1135)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1320)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)
    ... 55 more

Когда я изменяю его на @JoinColumn(name = "userId", insertable=false, updatable=false), он развертывается без проблем, столбец создается в базе данных, но когда я вызываю setKeyAccountManager (), значение неустановить в базе данных.

Как я могу иметь 2 объекта одного типа в этом классе?Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Предположим, что класс, который должен иметь тип 2 User, сопоставлен с таблицей с именем License

name атрибут @JoinColumn определяет имя столбца в таблице лицензий, который имеет ограничение внешнего ключа для таблицы User. Это определенно не относится к первичному ключу таблицы User, так как эта информация должна быть аннотирована в самом классе User.

Итак, в вашем случае вы должны определить @JoinColumn с разными именами, например:

@ManyToOne
@JoinColumn(name = "user_Id")
@ForeignKey(name = "license_users_fk")
public User getUser() {
    return user;
}

@ManyToOne
@JoinColumn(name = "key_acct_mgr_id")
@ForeignKey(name = "license_kam_fk")
public User getKeyAccountManager() {
    return keyAccountManager;
}

Затем оно сопоставляется со следующей структурой таблицы:

==================================================
| License                                        |
==================================================
|id (Primary key of table License)               |
|user_Id (Foreign key to the User Table)         |
|key_acct_mgr_id (Foreign key to the User Table) |
==================================================
2 голосов
/ 06 марта 2012

Проблема не в том, что они одного класса.Проблема заключается в том, что они оба сопоставляются со столбцом userId.

Hibernate ожидает, что getKeyAccountManager () будет представлять столбец userId или getUser (), но не оба из них.

Возможно, выссылаетесь не на тот столбец?

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