Problema básico com relação a chave estrangeira

4 respostas
G

Pessoal, já li vários tópicos sobre chave estrangeira, mas não consegui entender direitinho, dai resolvi apelar
Tô usando o Hibernate com anotações, tenho a classe Automovel e a classe Categoria, o Automovel tem como chave primaria o numero do chassi, a categoria tem o ID, o Automovel tem que ter uma categoria, onde eu torno popular o nome da Categoria, gostaria que quando uma Categoria fosse editada, já editasse automaticamente no automóvel, até ai tudo bem, mas também gostaria que quando removessem uma categoria, removessem todos os Automoevis relacionados a ela.

Segue o código das classes:

@Entity

@Table(name = "Automovel")
public class Automovel implements Serializable {

    @Id
    @Column(name = "numero_chassi", unique = true, nullable = false)
    private String numeroChassi;

    @Column(name = "placa", unique = true, nullable = false)
    private String placa;

    @Column(name = "modelo", nullable = false)
    private String modelo;

    @Column(name = "ano", nullable = false)
    private int ano;

    @Column(name = "cor", nullable = false)
    private String cor;

    @OneToOne(fetch = FetchType.EAGER)
    @Cascade(CascadeType.ALL)
    @JoinColumn(name = "id_marca")
    private Marca marca;

    @OneToOne(fetch = FetchType.EAGER)
    @Cascade(CascadeType.ALL)
    @JoinColumn(name = "id_categoria")
    private Categoria categoria;
@Entity

@Table(name = "Categoria")
public class Categoria implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_categoria", unique = true, nullable = false)
    int id;

    @Column(name = "nome", nullable = false)
    String nome;

    @Column(name = "valor", nullable = false)
    double valor;

    @Column(name = "descricao", nullable = false)
    String descricao;

Alguém poderia dizer o que estou fazendo de errado?

4 Respostas

davidbuzatto

Pq está usando OneToOne?
A Marca X não pode ser usada em diversos automóveis? Vc mesmo disse isso.
Idem a Categoria.

O que não entendeu sobre chave estrangeira?

[]´s

G

Eu coloquei OneToOne porque pensei assim:

1 Automóvel -> 1 Categoria
1 Automóvel -> 1 Marca

Fiz errado mesmo?

E quando eu atualizo a categoria/marca, o automóvel tem os dados atualizados, mas quando eu deleto uma categoria/marca, gostaria que os automóveis relacionados fossem deletados também, mas não acontece, só funciona na atualização

Pode me explicar isso? Obrigado!

davidbuzatto

Então, se uma marca vai ser usada em N automóveis e uma categoria vai ser usada em N automóveis tbm, vc deve usar ManyToOne e não OneToOne.
OneToOne vc usa somente se cada registro do tipo automóvel for se relacionar com uma E SOMENTE UMA vez com uma marca ou categoria. Entende?
Mas uma categoria e uma marca podem se relacionar com outros automóveis, pq vc quer reaproveitar as marcas e as categorias certo?
Quando ao delete cascade, basta vc especificar no Cascade como vc está fazendo.

[]´s

G

Colocando CascadeType.ALL não já devia resolver esse problema?

Criado 15 de junho de 2010
Ultima resposta 15 de jun. de 2010
Respostas 4
Participantes 2