2014-06-12 165 views
0

我正面臨單向onetomany映射的一些問題。 我表用戶和Rubrica:單向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店主,用戶和聯繫人之間的關係,也是一組用戶。 用戶映射如下:

@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 

supertables和輔助表

如果我映射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>(); 
    ... 
} 

我在運行時得到了不好的行爲。如果我運行此代碼

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); 

我得到這個異常:

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 

我按照理論指出here約一對多單向的。 我使用JPA2.0,Hibernate4(由JBoss7.1.1.Final提供)和PostgresSQL。

+0

是類名Utente是用戶? – Gayathri

+0

@Gayathri是的。更新謝謝。 – Francesco

回答

0

這種映射或數據庫設計沒有意義。如果您希望一個Rubrica擁有多個聯繫人,那麼您不能在rubrica表中具有該關係的外鍵。一個外鍵只能引用一個聯繫,不多。

要映射這樣的一對多關聯,您需要用戶使用rubrica的外鍵(具有相同rubrica_id的所有用戶將成爲此rubrica的聯繫人)或兩個表之間的連接表。

+0

幫我理解。你爲什麼說「沒有道理......外鍵只能引用一個聯繫人,而不是很多」?用戶不會介意是否在Rubrica條目中提及。 Rubrica.id_contact指User.scode,Rubrica中的一行僅指用戶作爲聯繫人。怎麼了?我認爲這個案例與我發佈的鏈接中的Employee - Phone示例非常相似,不是嗎? – Francesco

+0

您希望每個rubrica都有*幾個*聯繫人。您嘗試使用rubrica表中的用戶標識來映射它。因此,代表Rubrica的一個實例的rubrica表的每一行都會引用* one *聯繫人。你怎麼可以參考*使用*一個*用戶ID的幾個*用戶? –

+0

好的。所以整個東西將無法工作,因爲實體Rubrica不能同時封裝Set並擁有前衛關鍵。在Employee-Phone示例中,Phone有一個未映射到其實體的Employee的外鍵。我無法更改用戶表,我必須使用連接表。我收到了嗎? – Francesco