Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > OneToMany без PK


Автор: ShurikA 20.7.2009, 11:09
Есть две таблицы User и Roles.
В таблице User есть единый PK.
Таблица Roles состоит цобственно только из Composite PK.

Roles entity
Код

@Entity
@Table(name = "Roles", catalog = "organization", schema = "")
public class Roles implements Serializable {

    @EmbeddedId
    private RoleId id;
    private Integer userId;
    private String rolename;

    public String getRolename() {
        return rolename;
    }

    public void setRolename(String rolename) {
        this.rolename = rolename;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Roles)) {
            return false;
        }
        Roles other = (Roles) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "auth.usr.Authority[id=" + id + "]";
    }
}


User Entity:
Код

....
@OneToMany(fetch = FetchType.EAGER, targetEntity = Roles.class, mappedBy = "userId")
private Set<Roles> roles;
...


Вроде всё по правилам. Но нет, у меня гладко быть не может...
Код

Exception Description: An incompatible mapping has been encountered between [class auth.usr.SystemUser] and [class auth.usr.Roles]. This usually occurs when the cardinality of a mapping does not correspond with the cardinality of its backpointer.


Что я пропускаю?

Добавлено через 1 минуту и 45 секунд
Извиняйте, тему написал не правильно...

Автор: MisterCleric 20.7.2009, 15:16
Цитата

@OneToMany(fetch = FetchType.EAGER, targetEntity = Roles.class, mappedBy = "userId")

Разве у тебя User Entity типа Integer?
mappedBy предназначен для bidiraction, т.е. если обе сущности имеют ссылку друг на друга.

У тебя же есть только ссылка у Юзера на его Роли. То что роль имеет форинг кей на юзера еще не показывает, что роль в твоей модели ссылается на юзера. 
Должно быть так:
Код

@OneToMany
@JoinColumn(name = "userId")
private Set<Roles> roles;

Автор: ShurikA 21.7.2009, 01:19
Цитата(MisterCleric @  20.7.2009,  14:16 Найти цитируемый пост)
@OneToMany
@JoinColumn(name = "userId")
private Set<Roles> roles;

по моему ты не совсем прав:
Код

Exception Description: @OneToMany for attribute name [roles] in entity class [class auth.usr.SystemUser] should not have @JoinColumn(s) specified. In the case where the @OneToMany is not mapped by another entity (that is, it is the owning side and is uni-directional), it should specify (optional through defaulting) a @JoinTable.


На сколько я понимаю тут нужно пользоваться @JoinTable внутри которого будет @JoinColumn.
Что то типа такого:
Код

    @OneToMany
    @JoinTable(
        name="Roles",
        joinColumns=@JoinColumn(name="userId")
    )
    private Set<Roles> roles;


Прав?

Автор: MisterCleric 21.7.2009, 11:08
И еще раз привет.
Ну раз требует так по иксепшену, то значит надо.
а вообще-то ну вообще какое-то странное поведение...
Можешь показать структуру своих таблиц: примари кеи, форинг кеи.
Может надо нормализацию базы сделать? я не давно тут подымал такой вопрос, по поводу того, что ненормализованная база приводит к каким-то затруднениям что при мепинге, что при CRUD-операциях

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)