2 Entidades com o mesmo Id?

6 respostas
B

Ola Galera,
Já estou a um tempo pesquisando isso no google e não acho, entao resolvi postar minha dúvida aqui:

Estou tentando fazer com que uma classe tenha sempre o mesmo Id que a outra, ou seja, que uma classe tenha sua chave primária igual a da outra:
O que eu cheguei mais perto foi desse link aqui:
http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

Porém não funcionou.
Mas a ideia é a mesma desse link
Tenho uma classe usuario e uma profile:
Queria que profile tivesse a mesma chave primária do seu usuário:

public class User implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	@OneToOne(cascade=CascadeType.ALL, mappedBy="user")
	private Profile profile;
}
public class Profile implements Serializable{
	private static final Logger LOG = Logger.getLogger(Profile.class);
	
	@Id
	private Integer id;
	
	@Id Integer id;

	@MapsId @OneToOne
	@JoinColumn(name = "user_id")
	private User user;

Só que não está funcionando, primeiro ele reclamou do mapedBy da classe User, depois se eu retirar o mapedBy, ele cria uma coluna user_id e uma coluna id onde essa ultima é a chave primária.

Alguem sabe como resolver?

6 Respostas

jokacwb

Veja no exemplo a seguir um mapeamento de Pergunta e Resposta, onde cada pergunta deve
ter apenas uma resposta:

public class Pergunta {  
      
    @Id  
    @GeneratedValue  
    private Long Id;  
  
    @OneToOne  
    @JoinColumn(name = "id", unique = true)  
    private Resposta resposta;          
          
        @Column  
    private String descricao;  
      //getter and Setters  
}  
  
public class Resposta {  
      
    @Id
    @GeneratedValue
    private Long Id;      
  
    @OneToOne  
        @JoinColumn(name = "id", unique = true)  
    private Pergunta pergunta;    
  
        @Column  
    private String descricao;           
       //getter and Setters  
  
}

Note que quando é feito o relacionamento um pra um é configurado tb para ser único
vai existir um id em Resposta que pode variar, no entanto vc tem uma chave
estrangeira que garante a unicidade.

L

Da uma olhada no @PrimaryKeyJoinColumn e como o colega acima disse, isso é um relacionamento um para um.

B

Obrigado pelas respostas:

mas acho que não expliquei direito minha duvida.

Eu gostaria que a classe perfil tivesse como chave primária o id da classe user.

como se a tabela perfil fosse assim:

user_id:

sem a coluna id.

Pesquisando melhor eu descobri que o nome do relacionamento que eu quero fazer é Shared Primary Key ou Primary Foreign Key, acho que agora da para entender melhor minha dúvida.

rafaelvascon

Uma forma seria usar herança:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name = "pessoa")
public class Pessoa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "idPessoa")
    private Integer idPessoa;
@Entity
@PrimaryKeyJoinColumn(referencedColumnName="idPessoa")
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name = "aluno")

public class Aluno extends Pessoa{

No caso, a classe aluno já herda a chave primária idPessoa.

B

Resolvi da seguinte forma:

public class Profile implements Serializable {
	private static final Logger LOG = Logger.getLogger(Profile.class);

	@Id
	@GenericGenerator(name = "myForeignGenerator",
			strategy = "foreign", 
			parameters = { @Parameter(name = "property", value = "user")
	})
	@GeneratedValue(generator="myForeignGenerator")
	@Column(name="user_id")
	private Integer id;

	@OneToOne
	@PrimaryKeyJoinColumn
	private User user;

se alguem tiver uma ideia melhor, por favor postar aqui =)

E

bartorista,

A classe User continua com a mesma configuracao inicial ??

estou com omesmo problema…

Criado 10 de junho de 2011
Ultima resposta 20 de jun. de 2011
Respostas 6
Participantes 5