Problema ao gerar tabelas no JPA

Java

22/04/2012

Colegas,
estou fazendo as aula da loja virtual postadas pelo Dyego.
Uso a IDE do Eclipse. Quando uso a opção do JPA para criar as tabela com base nas classes, me retorna o erro:


Exception in thread main Local Exception Stack:
Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: sun.misc.Launcher$AppClassLoader@17577f9
Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [EcommerceWebApplication] failed.
Internal Exception: Exception [EclipseLink-7151] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The type [class java.lang.String] for the attribute [flag] on the entity class [class br.com.devmedia.entity.CreditCards] is not a valid type for an enumerated mapping. The attribute must be defined as a Java enum.
at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126)
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:105)
at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
at org.eclipse.jpt.eclipselink.core.ddlgen.Main.execute(Main.java:76)
at org.eclipse.jpt.eclipselink.core.ddlgen.Main.main(Main.java:64)
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [EcommerceWebApplication] failed.
Internal Exception: Exception [EclipseLink-7151] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The type [class java.lang.String] for the attribute [flag] on the entity class [class br.com.devmedia.entity.CreditCards] is not a valid type for an enumerated mapping. The attribute must be defined as a Java enum.
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1127)
at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:101)
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:96)
... 3 more
Caused by: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [EcommerceWebApplication] failed.
Internal Exception: Exception [EclipseLink-7151] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The type [class java.lang.String] for the attribute [flag] on the entity class [class br.com.devmedia.entity.CreditCards] is not a valid type for an enumerated mapping. The attribute must be defined as a Java enum.
at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:210)
... 6 more
Caused by: Exception [EclipseLink-7151] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The type [class java.lang.String] for the attribute [flag] on the entity class [class br.com.devmedia.entity.CreditCards] is not a valid type for an enumerated mapping. The attribute must be defined as a Java enum.
at org.eclipse.persistence.exceptions.ValidationException.invalidTypeForEnumeratedAttribute(ValidationException.java:1076)
at org.eclipse.persistence.internal.jpa.metadata.converters.EnumeratedMetadata.process(EnumeratedMetadata.java:111)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processEnumerated(MappingAccessor.java:1439)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.BasicAccessor.processEnumerated(BasicAccessor.java:413)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processJPAConverters(MappingAccessor.java:1467)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processMappingConverter(MappingAccessor.java:1535)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processMappingValueConverter(MappingAccessor.java:1553)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.BasicAccessor.process(BasicAccessor.java:372)
at org.eclipse.persistence.internal.jpa.metadata.MetadataDescriptor.processMappingAccessors(MetadataDescriptor.java:1417)
at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.processMappingAccessors(ClassAccessor.java:1438)
at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.processMappingAccessors(EntityAccessor.java:1061)
at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.process(EntityAccessor.java:603)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage2(MetadataProject.java:1541)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:485)
at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:454)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1081)
... 5 more




Classe CreditCards




package br.com.devmedia.entity;

import java.io.Serializable;
import java.lang.Integer;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotEmpty;


/**
* Entity implementation class for Entity: CreditCards
*
*/
/**
* @author nsouza
*
*/
@Entity
@Table(name=CreditCards,schema=App)

public class CreditCards implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer Id;
@NotNull
@NotEmpty
@Column(nullable = false)
private String number;

@Temporal(javax.persistence.TemporalType.DATE)
@NotNull
@Column(nullable = false)
private Date dateOfValidation;

@Column(nullable = false)
@NotNull
@NotEmpty
private String nameOfCardOwner;

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private String flag;

@Column(nullable=false)
@Min(1)
private int times;

@JoinColumn(referencedColumnName = id)
@ManyToOne(optional = false)
@Valid
private User user;


@OneToMany(cascade=CascadeType.ALL,mappedBy=creditcard)
private List<Sell> sells = new LinkedList<Sell>();

public CreditCards() {

}

public Integer getId() {
return this.Id;
}

public void setId(Integer Id) {
this.Id = Id;
}

public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number;
}

public Date getDateOfValidation() {
return dateOfValidation;
}

public void setDateOfValidation(Date dateOfValidation) {
this.dateOfValidation = dateOfValidation;
}

public String getNameOfCardOwner() {
return nameOfCardOwner;
}

public void setNameOfCardOwner(String nameOfCardOwner) {
this.nameOfCardOwner = nameOfCardOwner;
}

public String getFlag() {
return flag;
}

public void setFlag(String flag) {
this.flag = flag;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}



public void setTimes(int times) {
this.times = times;
}

public int getTimes() {
return times;
}

public List<Sell> getSells() {
return sells;
}

public void setSells(List<Sell> sells) {
this.sells = sells;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((Id == null) ? 0 : Id.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CreditCards other = (CreditCards) obj;
if (Id == null) {
if (other.Id != null)
return false;
} else if (!Id.equals(other.Id))
return false;
return true;
}

}




Minha entidade FlagType tem o seguinte codigo:

package br.com.devmedia.type;

public enum FlagType {
VISA,MASTERCARD,AMERICANEXPRESS;

}



Nilo Souza

Nilo Souza

Curtidas 0

Respostas

Robson Teixeira

Robson Teixeira

22/04/2012

Ola Nilo note o atributo que você mapeou logo abaixo.

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private String flag;

e agora note como deveria ser esse atributo.

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private FlagType flag;


pois no stacktrace que você postou informa que você usou a anotação @Enumerated em um atributo que não é um enum e essa anotação foi criada exclusivamente para persistir atributos do tipo enum.
veja logo abaixo essa parte tirada do log que você postou.

Exception Description: The type [class java.lang.String] for the attribute [flag] on the entity class [class br.com.devmedia.entity.CreditCards] is not a valid type for an enumerated mapping. The attribute must be defined as a Java enum.

espero ter ajudado.
att
robson
GOSTEI 0
POSTAR