Chave composta socorro!

4 respostas
C

Galera tenho as seguintes classes :

Entrada

@Embeddable
@IdClass(Entrada.class)
public class Entrada {
 	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer numero ;
			
	@Embedded
	@Temporal(TemporalType.DATE)
	private Date dataEntrada;	 	
	 
	@ManyToOne
	@JoinColumn(name="FORNECEDOR")
	private Fornecedor fornecedor;
		
	@OneToMany()
	private List<ItemEntrada> itemEntrada;
}

ItemEntrada

@Entity
public class ItemEntrada {
 
	@Column(precision=9, scale=2)
	private Double quantidade;
	 
	@Column(precision=9, scale=2)
	private Double valor;
	   
	@ManyToOne
	@JoinColumn(name="INSUMO")
	private Insumo insumo;
	
	@EmbeddedId
	@ManyToOne
	@JoinColumns({@JoinColumn(name="NUMERO"),@JoinColumn(name="DATAENTRADA")})
	private Entrada entrada;
}

qdo mando criar as tabelas no banco, a tabela "ItemEntrada" é criada com as chaves composta... blz certinho!!...

Só que a tabela de Entrada não é criada..

Alguém manja ?

4 Respostas

rodolfoliviero

a tabela não é criada pq a classe entrada não ta anotada com @Entity…Ela é um ID…id não representa uma entidade

C

então… veio… se eu colocar a anotação “Entity” da esse erro aí :

Exception in thread "main" javax.persistence.PersistenceException: Exception [TOPLINK-28018] (Oracle TopLink Essentials - 2.0 (Build b41-beta2 (03/30/2007))): oracle.toplink.essentials.exceptions.EntityManagerSetupException Exception Description: predeploy for PersistenceUnit [foodmanager] failed. Internal Exception: java.lang.NullPointerException at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:615) at oracle.toplink.essentials.internal.ejb.cmp3.JavaSECMPInitializer.callPredeploy(JavaSECMPInitializer.java:146) at oracle.toplink.essentials.internal.ejb.cmp3.JavaSECMPInitializer.initPersistenceUnits(JavaSECMPInitializer.java:226) at oracle.toplink.essentials.internal.ejb.cmp3.JavaSECMPInitializer.initialize(JavaSECMPInitializer.java:242) at oracle.toplink.essentials.internal.ejb.cmp3.JavaSECMPInitializer.initializeFromMain(JavaSECMPInitializer.java:278) at oracle.toplink.essentials.internal.ejb.cmp3.JavaSECMPInitializer.getJavaSECMPInitializer(JavaSECMPInitializer.java:81) at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.createEntityManagerFactory(EntityManagerFactoryProvider.java:119) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83) at util.CriarBanco.main(CriarBanco.java:18) Caused by: Exception [TOPLINK-28018] (Oracle TopLink Essentials - 2.0 (Build b41-beta2 (03/30/2007))): oracle.toplink.essentials.exceptions.EntityManagerSetupException Exception Description: predeploy for PersistenceUnit [foodmanager] failed. Internal Exception: java.lang.NullPointerException at oracle.toplink.essentials.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:212) ... 9 more Caused by: java.lang.NullPointerException at oracle.toplink.essentials.internal.ejb.cmp3.metadata.MetadataDescriptor.usesPropertyAccess(MetadataDescriptor.java:1062) at oracle.toplink.essentials.internal.ejb.cmp3.metadata.accessors.EmbeddedIdAccessor.processEmbeddableClass(EmbeddedIdAccessor.java:130) at oracle.toplink.essentials.internal.ejb.cmp3.metadata.accessors.EmbeddedAccessor.process(EmbeddedAccessor.java:283) at oracle.toplink.essentials.internal.ejb.cmp3.metadata.accessors.EmbeddedIdAccessor.process(EmbeddedIdAccessor.java:89) at oracle.toplink.essentials.internal.ejb.cmp3.metadata.accessors.ClassAccessor.processAccessor(ClassAccessor.java:513) at oracle.toplink.essentials.internal.ejb.cmp3.metadata.accessors.ClassAccessor.processAccessorFields(ClassAccessor.java:526) at oracle.toplink.essentials.internal.ejb.cmp3.metadata.accessors.ClassAccessor.processAccessors(ClassAccessor.java:552) at oracle.toplink.essentials.internal.ejb.cmp3.metadata.accessors.ClassAccessor.process(ClassAccessor.java:483) at oracle.toplink.essentials.internal.ejb.cmp3.metadata.MetadataProcessor.processAnnotations(MetadataProcessor.java:225) at oracle.toplink.essentials.ejb.cmp3.persistence.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:354) at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:584) ... 8 more

como q faço pra resolver esse relacionamento ?

C

pessoal, pesquisando e pesquisando por aí... fiz a seguinte alteração..

Entrada

@Entity
public class Entrada implements Serializable {
 	
	private static final long serialVersionUID = 1L;

	@EmbeddedId
	private EntradaPK entradaPK;
    
	@ManyToOne
	@JoinColumn(name="FORNECEDOR")
	private Fornecedor fornecedor;
		
	@OneToMany()
	private List<ItemEntrada> itemEntrada;
}

ItemEntrada

@Entity
public class ItemEntrada implements Serializable {
 
	private static final long serialVersionUID = 1L;

	@Column(precision=9, scale=2)
	private Double quantidade;
	 
	@Column(precision=9, scale=2)
	private Double valor;
	   
	@ManyToOne
	@JoinColumn(name="INSUMO")
	private Insumo insumo;
	
	@EmbeddedId
	@ManyToOne
	@JoinColumns({@JoinColumn(name="numero"), @JoinColumn(name="dataEntrada")})	
	private EntradaPK entradaPK;
}

EntradaPK

@Embeddable
public class EntradaPK implements Serializable {
 	
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer numero;

	@Embedded
	@Temporal(value=TemporalType.DATE)
	private Date dataEntrada;
}

Quando vou gerar as tabelas do banco de dados, ele Cria a tabela Entrada e ItemEntrada certinho. Só que agora ele está criando também uma tabela entrada_itementrada, que não deveria ser criada.

Me ajudem por favor!!!

C

Galera to quase chegando... só ta faltando um empurrãozinho!!!!

Fiz essas modificações, ele criou a tabela entrada, mas o campo "DATAENTRADA" não ficou como PK

+----------------+--------------+------+-----+
| Field          | Type         | Null | Key |
+----------------+--------------+------+-----+
| NUMERO         | int(11)      |      | PRI |
| DATAENTRADA    | date         | YES  |     |
| FORNECEDOR     | int(11)      | YES  |     |
+----------------+--------------+------+-----+

e a tabela itemEntrada o "INSUMO" não ficou como chave primária e ele criou um atributo a mais "ENTRADANUMERO".

+----------------+--------------+------+-----+
| Field          | Type         | Null | Key |
+----------------+--------------+------+-----+
| VALOR          | double       | YES  |     |
| QUANTIDADE     | double       | YES  |     |
| DATAENTRADA    | date         |      | PRI |
| NUMERO         | int(11)      |      | PRI |
| ENTRADA_NUMERO | int(11)      | YES  |     |
| INSUMO         | varchar(255) | YES  |     |
+----------------+--------------+------+-----+

Entrada

@Entity
public class Entrada implements Serializable {
 	
	private static final long serialVersionUID = 1L;
   
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)	
	private Integer numero;
		
	@Embedded
	@Temporal(value=TemporalType.DATE)	
	private Date dataEntrada;
	
	@ManyToOne()
	@JoinColumn(name="FORNECEDOR")
	private Fornecedor fornecedor;
	
	@OneToMany(targetEntity=ItemEntrada.class, mappedBy="entrada")
	private List<ItemEntrada> itemEntrada ;	
}

ItemEntrada

@Entity
public class ItemEntrada implements Serializable {

	private static final long serialVersionUID = 1L;
		
	@Embeddable
	static class EntradaPK{

		@Id
		@GeneratedValue(strategy=GenerationType.IDENTITY)
		private Integer numero;
			
		@Embedded
		@Temporal(value=TemporalType.DATE)	
		private Date dataEntrada;
			
		//@Id
		//private Integer insumo;
		
		@ManyToOne(targetEntity = Insumo.class)
		@JoinColumn(name="INSUMO", insertable=false, updatable=false)		
		private Insumo insumo;	
		
		@ManyToOne(targetEntity = Entrada.class)		
		private Entrada entrada;
		
		public Entrada getEntrada() {
			return entrada;
		}

		public void setEntrada(Entrada entrada) {
			this.entrada = entrada;
		}

			
	}
	
	@Column(precision=9, scale=2)
	private Double quantidade;
	 
	@Column(precision=9, scale=2)
	private Double valor;
		
	@EmbeddedId
	private EntradaPK entradaPK;
}

Alguém me ajuda ae PLEASE!!!

Criado 18 de dezembro de 2007
Ultima resposta 20 de dez. de 2007
Respostas 4
Participantes 2