Problema ao gerar tabelas no JPA
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;
}
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
Curtidas 0
Respostas
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
@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