Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 单向单域映射问题_Jpa_Jpa 2.0 - Fatal编程技术网

Jpa 单向单域映射问题

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

我面临一些单向一对一映射的问题。 我得到了用户和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 (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