Jpa 单向单域映射问题
我面临一些单向一对一映射的问题。 我得到了用户和Rubrica的表格:Jpa 单向单域映射问题,jpa,jpa-2.0,Jpa,Jpa 2.0,我面临一些单向一对一映射的问题。 我得到了用户和Rubrica的表格: 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 (i
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>();
...
}
超表和次表
如果我这样映射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>();
...
}
我得到了一个例外:
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
我遵循的理论是关于一家公司单向的。
我使用的是JPA2.0、Hibernate4(由JBoss7.1.1.Final提供)和PostgresSQL。这种映射或数据库设计毫无意义。如果希望一个Rubrica具有多个联系人,则Rubrica表中的关系不能有外键。外键只能引用一个联系人,不能引用多个联系人
要映射这种一对多关联,您需要在user To rubrica(具有相同rubrica_id的所有用户都将是此rubrica的联系人)中使用外键,或者在两个表之间使用联接表。类名Utente是user吗?@Gayathri是的。更新谢谢。帮我理解。为什么你说“毫无意义……外键只能引用一个联系人,而不能引用多个联系人”?用户不会介意在Rubrica条目中引用他们。Rubrica.id\u contact指的是User.scode,Rubrica中的一行仅指作为联系人的用户。发生了什么?我认为这个案例与我发布的链接中的员工电话示例非常相似,不是吗?你希望每个rubrica都有几个联系人。您可以尝试使用rubrica表中的用户ID来映射它。所以rubrica表的每一行,代表一个rubrica实例,将引用一个联系人。如何使用一个用户ID引用多个用户?好的。所以所有的东西都不起作用,因为实体Rubrica不能既封装集合又有一个foreing键。在Employee Phone示例中,Phone的实体中未映射Employee的外键。我不能更改用户表,我必须使用jointable。我明白了吗?不,你没有。在用户电话示例中;用户有一个带手机的OneToMany。它由phone表中的外键映射(即关联的多个方面的表)。在您的代码中,Rubrica与用户有一个OneToMany。但是,您没有使用用户表中的外键映射它(这是关联的多个方面),而是尝试使用rubrica表中的外键映射它(这是关联的一个方面)。那没有道理。如果rubrica有许多用户,则外键需要位于用户表中。
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