2014-06-12 5 views
0

단방향 onetomany 매핑에 문제가 있습니다. 단방향 OneToMany 매핑 문제

User (
scode double precision NOT NULL, 
... 
CONSTRAINT utenti_pkey PRIMARY KEY (scode) 
) 

Rubrica (
id serial NOT NULL, 
id_owner integer NOT NULL, 
id_contact integer NOT NULL, 
CONSTRAINT rubrica_pkey PRIMARY KEY (id), 
CONSTRAINT rubrica_fk01 FOREIGN KEY (id_owner) 
    REFERENCES users (scode) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION, 
CONSTRAINT rubrica_fk02 FOREIGN KEY (id_contact) 
    REFERENCES users (scode) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

사용자를 두 번 PKEY에 대해 신경 쓰지 마 : 나는 테이블 사용자 및 Rubrica을 얻었다. 그것은 고객의 테이블이며 수정할 수 없습니다. Rubrica는 소유자, 사용자 및 연락처, 사용자 집합 간의 관계를 저장합니다. 사용자는 다음과 같이 매핑됩니다 :

@SuppressWarnings("serial") 
@Entity 
@Table(name = "utenti", schema = "public") 
public class User implements Serializable { 
    @Id 
    @Column(name = "scode", unique = true, nullable = false) 
    private Integer scode; 
... 
} 

좋아. 여기 문제가 올 때입니다. 나는이 같은 Rubrica를 매핑하는 경우 :

public class Rubrica2 implements Serializable { 
    @Id 
    @Column(name = "id", nullable = false, unique = true) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @OneToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "id_owner", nullable = false, unique = true, referencedColumnName = "scode") 
    private User owner; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "id_contact", nullable = false, updatable = false, insertable = true, referencedColumnName = "scode") 
    private Set<User> relations = new HashSet<User>(); 
    ... 
} 

JBoss는 배포에 나에게이 예외를 주었다

Caused by: org.hibernate.MappingException: Unable to find column with logical name: scode in org.hibernate.mapping.Table(public.rubrica) and its related 

퍼 테이블과 보조 테이블

나는이 방법 Rubrica를 매핑하는 경우 :

public class Rubrica2 implements Serializable { 
    @Id 
    @Column(name = "id", nullable = false, unique = true) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @OneToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "id_owner", nullable = false, unique = true, referencedColumnName = "scode") 
    private User owner; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "scode") 
    private Set<User> relations = new HashSet<User>(); 
    ... 
} 

런타임에 문제가 생겼습니다. 나는 이론이 onetomany 단방향에 대해 here를 지시에 따라

Hibernate: insert into public.rubrica (id_owner) values (?) 
11:08:19,440 DEBUG [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (EJB default - 7) 
    ERROR: null values in column "id_contact" violates not-null constraint [n/a]: org.postgresql.util.PSQLException: 
    ERROR: null values in column "id_contact" violates not-null constraint 

:이 코드

r = new Rubrica2(); 
q2.setParameter("id", ownerID); 
User owner = (User) q2.getSingleResult(); 
r.setOwner(owner); 
q2.setParameter("id", contactID); 
User u = (User) q2.getSingleResult(); 
r.getRelations().add(u); 
entityManager.persist(r); 

를 실행하면 나는이 예외를 얻었다. JPA2.0, Hibernate4 (JBoss7.1.1.Final에서 제공) 및 PostgresSQL을 사용하고 있습니다.

+0

클래스 이름 사용 사용자입니다? – Gayathri

+0

@ 가야 트리 예. 업데이트되었습니다. – Francesco

답변

0

이 매핑 또는 데이터베이스 디자인은 의미가 없습니다. 하나의 Rubrica가 많은 대화 상대를 가지게하려면 rubrica 테이블의 관계에 외래 키를 사용할 수 없습니다. 외래 키는 개의 연락처 중 하나만 참조 할 수 있습니다.

그런 일대 다 연관을 매핑하려면 사용자에게 rubrica (동일한 rubrica_id를 가진 모든 사용자가이 rubrica의 연락처가 될 것임) 또는 두 테이블 사이의 조인 테이블에 외래 키가 필요합니다.

+0

이해 도와주세요. 왜 "말이 안된다 ... 외래 키는 많은 사람이 아닌 한 명의 연락처 만 참조 할 수 있습니까?" 사용자는 Rubrica 항목에서 참조되는지 여부는 신경 쓰지 않습니다. Rubrica.id_contact는 User.scode를 참조하고, Rubrica의 행은 사용자를 연락처로 참조합니다. 뭐가 문제 야? 이 사례는 내가 게시하는 링크의 Employee - Phone 예제와 매우 유사하다고 생각합니다. – Francesco

+0

각 rubrica에 * 여러 * 연락처가 있어야합니다. 그리고 루 브리 카 테이블에 사용자 ID를 사용하여이를 매핑하려고합니다. Rubrica의 한 인스턴스를 나타내는 rubrica 테이블의 각 행은 * one * contact를 참조합니다. 어떻게 * * 사용자 ID를 사용하여 * 여러 명의 사용자를 참조 할 수 있습니까? –

+0

확인. 그래서 엔티티 Rubrica가 Set를 캡슐화하고 foreing key를 가질 수 없기 때문에 모든 것들이 작동하지 않을 것입니다. Employee-Phone 예제에서 Phone에는 Employee에 대한 외래 키가 Entity에 매핑되어 있지 않습니다. 사용자 테이블을 변경할 수 없으며 접합 가능을 사용해야합니다. 알았어? – Francesco

관련 문제