@OneToOne(optional= ...) ou @JoinColumn(name="...", nullable=false)?

Olá pessoal, estou utilizando JPA e o BD Postgres.

Eu tenho um relacionamento 1 pra 1 obrigatório. Como eu represento isso na minha classe de entidade?

Pesquisei e vi que tem as seguintes formas:

    @OneToOne(optional=false)
    @JoinColumn(name="codigoConsulta") //chave estrangeira.
    private Consulta consulta;

No BD a tabela é gerada da seguinte forma:

CREATE TABLE pedidoexame
(
  codigopedidoexame bigint NOT NULL,
  codigoconsulta bigint NOT NULL,
  CONSTRAINT pedidoexame_pkey PRIMARY KEY (codigopedidoexame),
  CONSTRAINT fkd9e5afc1335036c8 FOREIGN KEY (codigoconsulta)
      REFERENCES consulta (codigoconsulta) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT pedidoexame_codigoconsulta_key UNIQUE (codigoconsulta)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE pedidoexame OWNER TO postgres;

A segunda forma é:

    @OneToOne()
    @JoinColumn(name="codigoConsulta",nullable=false) //chave estrangeira.
    private Consulta consulta;

E a tabela no BD com o código acima é gerada da seguinte forma:

-- Table: pedidoexame

-- DROP TABLE pedidoexame;

CREATE TABLE pedidoexame
(
  codigopedidoexame bigint NOT NULL,
  codigoconsulta bigint NOT NULL,
  CONSTRAINT pedidoexame_pkey PRIMARY KEY (codigopedidoexame),
  CONSTRAINT fkd9e5afc1335036c8 FOREIGN KEY (codigoconsulta)
      REFERENCES consulta (codigoconsulta) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE pedidoexame OWNER TO postgres;

Ou seja a diferença é que ao usar optional=false a seguinte linha aparece:
CONSTRAINT pedidoexame_codigoconsulta_key UNIQUE (codigoconsulta)

Seria o correto para representar a relação 1 pra 1 obrigatório o optional?

Agradeço desde já,
Dina

Depende. O que é dito nos seus requisitos?
Um pedido de exame SEMPRE tem uma consulta? Então o optional é false.
Pode existir um pedido sem uma consulta? Então optional é true.

Como falei, depende dos requisitos.

David,
Obrigada:-)

[quote=dina]David,
Obrigada:-)[/quote]
Disponha :wink:

David,
Só uma coisa:
Qdo o relacionamento é N pra M, não dá pra colocar o optional?

@ManyToMany(targetEntity=Exame.class) @JoinTable(name="exame_pedidoExame", joinColumns=@JoinColumn(name="codigoExame", nullable=false), inverseJoinColumns=@JoinColumn(name="codigoPedidoExame", nullable=false)) private List<Exame> exames;
onde eu colocaria nesse caso o optional? Tentei e não tá dando certo…
Obrigada…!

[quote=dina]David,
Só uma coisa:
Qdo o relacionamento é N pra M, não dá pra colocar o optional?

@ManyToMany(targetEntity=Exame.class) @JoinTable(name="exame_pedidoExame", joinColumns=@JoinColumn(name="codigoExame", nullable=false), inverseJoinColumns=@JoinColumn(name="codigoPedidoExame", nullable=false)) private List<Exame> exames;
onde eu colocaria nesse caso o optional? Tentei e não tá dando certo…
Obrigada…![/quote]
Olá.
Então, um relacionamento NxM é “opcional por natureza”. Seria mais ou menos 0…* x 0…*. Você está usando JPA? Qual implementação? Se for a implementação do Hibernate você pode usar um validador para verificar a quantidade de elementos na List.

Ficaria algo como:

@ManyToMany(targetEntity=Exame.class) @JoinTable(name="exame_pedidoExame", joinColumns=@JoinColumn(name="codigoExame", nullable=false), inverseJoinColumns=@JoinColumn(name="codigoPedidoExame", nullable=false)) // deve existir no mínimo 1 @Length(min=1) private List<Exame> exames;

Note que essa restrição não vai ser empregada no modelo físico do banco, mas vai ser controlada pelo mecanismo de validação do Hibernate.

[]´s

Entendi David!
:slight_smile:

Valeu pelas explicações! Foi muito claro!
:slight_smile:

Obrigada novamente!!

[quote=dina]Entendi David!
:slight_smile:

Valeu pelas explicações! Foi muito claro!
:slight_smile:

Obrigada novamente!![/quote]

Disponha :wink:

Davi,

mas no caso de @ManyToOne eu uso optional = false ou nullable = false? Quando a FK é requerida.

Abraço
Ademir