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:
[code]public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@OneToOne(cascade=CascadeType.ALL, mappedBy="user")
private Profile profile;
}[/code]
[code]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;
[/code]
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?
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.
Da uma olhada no @PrimaryKeyJoinColumn e como o colega acima disse, isso é um relacionamento um para um.
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.
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.
Resolvi da seguinte forma:
[code]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;[/code]
se alguem tiver uma ideia melhor, por favor postar aqui =)
bartorista,
A classe User continua com a mesma configuracao inicial ??
estou com omesmo problema…