GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

[Dúvida] Mapear PK compsota por duas FK (Hibernate+Oracle11g)

java
hibernate
jpa
oracle
Tags: #<Tag:0x00007efdacf24b98> #<Tag:0x00007efdacf24a58> #<Tag:0x00007efdacf248f0> #<Tag:0x00007efdacf24788>

#1

Boa noite pessoal, estou com um pequeno problema na hora de mapear uma tabela no meu código Java.

A tabela em questão possui 4 campos, duas Foreign Keys e outros dois campos date comuns, o problema é que a Primary Key desta tabela é composta por essas duas FKs, não estou sabendo exatamente como mapear essa PK no Java, dei uma estudada em @IdClass, fiz do jeito abaixo o mapeamento, mas acredito que não está correto.

O nome da tabela é TBCRNR_CLBR_PRFR_CRNA, os campos que são FK são CD_CLBR e CD_PRFR_CLBR, essas duas FK formam a PK.

Criei uma classe que mapeia as duas FK chamada PreferencesRidePK, com apenas os dois atributos mapeados para essas FKs, e criei um atributo do tipo PreferencesRidePK na classe CollaboratorPreferences, essa classe está mapeada para tabela TBCRNR_CLBR_PRFR_CRNA

			import java.sql.Date;

		import javax.persistence.Column;
		import javax.persistence.Embeddable;
		import javax.persistence.Entity;
		import javax.persistence.Id;
		import javax.persistence.ManyToOne;
		import javax.persistence.Table;
		import javax.validation.constraints.NotNull;

		/**
		 * Classe CollaboratorPrefenrences mapeada com a colunas da tabela TBCRNR_CLBR_PRFR_CRNA
		 * @author Luiz Henrique Dias Silva
		 *
		 */
		@Entity
		@Embeddable
		@Table(name="TBCRNR_CLBR_PRFR_CRNA", schema="CARONAEASYADM")
		public class CollaboratorPreferences{
			

			@Id	
			@Column(name="CD_CLBR", columnDefinition = "NUMBER(19,0)")
			@NotNull
			private PreferencesRidePK PK;

			@Column(name="DH_CDTR_BASE", nullable=false)
			private Date registerDataTime;
			
			@Column(name="DH_MNTC_BASE", nullable=false)
			private Date supportDataTime;

		}


			import java.io.Serializable;
			import java.util.Objects;

			import javax.persistence.Column;
			import javax.persistence.EmbeddedId;
			import javax.persistence.GeneratedValue;
			import javax.persistence.ManyToOne;

			/**
			 * @author Luiz Henrique
			 *
			 */

			public class PreferencesRidePK implements Serializable {

				/**
				 * serialVersionUID
				 */
				private static final long serialVersionUID = 1L;

				@EmbeddedId
				@ManyToOne
				@GeneratedValue
				@Column(name = "CD_CLBR")
				private Collaborator collaboratorId;
				
				@EmbeddedId
				@ManyToOne
				@GeneratedValue
				@Column(name = "CD_PRFR_CLBR")
				private Preferences preferencesId;

				/**
				 * @return Retorno do atributo collaboratorId
				 */
				public Collaborator getCollaboratorId() {
					return collaboratorId;
				}

				/**
				 * @param Set
				 *            do atributo collaboratorId
				 */
				public void setCollaboratorId(Collaborator collaboratorId) {
					this.collaboratorId = collaboratorId;
				}

				/**
				 * @return Retorno do atributo preferencesId
				 */
				public Preferences getPreferencesId() {
					return preferencesId;
				}

				/**
				 * @param Set
				 *            do atributo preferencesId
				 */
				public void setPreferencesId(Preferences preferencesId) {
					this.preferencesId = preferencesId;
				}

				@Override
				public boolean equals(Object o) {
					if (this == o)
						return true;
					if (!(o instanceof PreferencesRidePK))
						return false;
					PreferencesRidePK that = (PreferencesRidePK) o;
					return Objects.equals(getCollaboratorId(), that.getCollaboratorId())
							&& Objects.equals(getPreferencesId(), getPreferencesId());

				}

				@Override
				public int hashCode() {
					return Objects.hash(getCollaboratorId(), getPreferencesId());
				}

			}

#2

É mais prático usar diretamente SQL nativo do que perder tanto tempo com solucoes intermediárias, quebrando a cabeça com diversas configuracoes de mapeamentos. Geralmente quem usa Hibernate evita criar chaves compostas. Mas possível é, veja se ajuda: http://www.universidadejava.com.br/materiais/jpa-chave-primaria-composta/


#3

Não entendi muito bem o que você disse, infelizmente o banco de dados chegou pra mim desse jeito, não tenho como altera-lo, de qualquer forma já resolvi o problema, grato.