tenho 3 tabelas
palavra
palavra_tipo_palavra
tipo_palavra
ou seja é um manyToMany entre palavra e tipo_palavra, com isto estou eu tenho que inserir os seguintes dados por exemplo:
infinitivo:achar
gerúndio:achando
particípio:achando
onde o primeiro dado antes dos dois pontos é tipo_palavra e depois dos dois pontos é palavra que por sua vez gera uma relação na palavra_tipo_palavra.
Já estou conseguindo inserir. só que estou com o seguinte problema:
onde eu tenho palavras iguais com tipos diferentes eu não queria que ficasse repetida na minha tabela de palavra, contudo gostaria que ela fizesse referencia com o tipo na tabela associativa exemplo:
id nome_palavra id_palavra id_tipo_palavra id nome_tipo_palavra
1 achar 1 1 1 infinitivo
2 achando 2 2 2 gerúndio
2 3 3 particípio
Já tentei utilizar o unique no campo nome da tabela palavra, contudo ele não consegui fazer a associação e me gera um:
879 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 23505
879 [main] ERROR org.hibernate.util.JDBCExceptionReporter - ERRO: duplicar chave viola a restrição de unicidade “palavra_nome_palavra_key”
minha inserção esta assim:
public void inserirPalavra(Palavra palavra) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
try {
log.info("Processando Palavra");
session.saveOrUpdate(palavra);
session.getTransaction().commit();
} catch (Exception erro) {
log.info("Erro na Inserção do Palavra : " + erro.getMessage()
+ "\n\n" + palavra.getNomePalavra() + "\n\n");
session.beginTransaction().rollback();
}
}
Você tem uma Unique Key chamada “palavra_nome_palavra_key” na tabela Palavra? Quais colunas fazem parte desta UK?
Quais dados você está tentando incluir na tabela Palavra quando acontece o erro?
ATENÇÃO! Quando for postar código, utilize a tag Code.
Posta os seus códigos, sql (criação) e os de persistência também…
//Classe de Persistencia
public class DaoGeneric {
static final Log log = LogFactory.getLog(DaoGeneric.class);
public void inserirPalavra(Palavra palavra) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
try {
log.info("Processando Palavra");
session.saveOrUpdate(palavra);
session.getTransaction().commit();
} catch (Exception erro) {
log.info("Erro na Inserção do Palavra : " + erro.getMessage()
+ "\n\n" + palavra.getNomePalavra() + "\n\n");
session.beginTransaction().rollback();
}
}
public void inserirTipoPalavra(TipoPalavra nomeTipoPalavra) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
try {
log.info("Processando Tipo Palavra");
session.saveOrUpdate(nomeTipoPalavra);
session.getTransaction().commit();
} catch (Exception erro) {
session.update(nomeTipoPalavra);
log.info("Erro na Inserção do Tipo de Palavra : " + erro
+ nomeTipoPalavra.getNomeTipoPalavra());
}
}
}
//classe da tabela Palavra
@Entity
@Table(name = "palavra")
public class Palavra implements Serializable {
private static final long serialVersionUID = 1L;
private int idPalavra;
private String nomePalavra;
private Set<TipoPalavra> tipoPalavras = new HashSet<TipoPalavra>(0);
public Palavra() {
}
public Palavra(int idPalavra, String nomePalavra) {
this.idPalavra = idPalavra;
this.nomePalavra = nomePalavra;
}
public Palavra(int idPalavra, String nomePalavra, Set<TipoPalavra> tipoPalavras) {
this.idPalavra = idPalavra;
this.nomePalavra = nomePalavra;
this.tipoPalavras = tipoPalavras;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id_palavra", nullable = false)
public int getIdPalavra() {
return this.idPalavra;
}
public void setIdPalavra(int idPalavra) {
this.idPalavra = idPalavra;
}
@Column(name = "nome_palavra", nullable = false, length = 65, updatable=true, unique=true)
public String getNomePalavra() {
return this.nomePalavra;
}
public void setNomePalavra(String nomePalavra) {
this.nomePalavra = nomePalavra;
}
@ManyToMany(fetch = FetchType.LAZY,cascade={CascadeType.ALL})
@Cascade(value={org.hibernate.annotations.CascadeType.ALL})
@JoinTable(name = "palavra_tipo_palavra", joinColumns = { @JoinColumn(name = "id_palavra", nullable = false, updatable = true) }, inverseJoinColumns = { @JoinColumn(name = "id_tipo_palavra", nullable = false, updatable = true) })
public Set<TipoPalavra> getTipoPalavras() {
return this.tipoPalavras;
}
public void setTipoPalavras(Set<TipoPalavra> tipoPalavras) {
this.tipoPalavras = tipoPalavras;
}
}
//Classe da tabela tipo palavra
@Entity
@Table(name = "tipo_palavra")
public class TipoPalavra implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private int idTipoPalavra;
private String nomeTipoPalavra;
private Set<Palavra> palavras = new HashSet<Palavra>(0);
public TipoPalavra() {
}
public TipoPalavra(int idTipoPalavra, String nomeTipoPalavra) {
this.idTipoPalavra = idTipoPalavra;
this.nomeTipoPalavra = nomeTipoPalavra;
}
public TipoPalavra(int idTipoPalavra, String nomeTipoPalavra, Set<Palavra> palavras) {
this.idTipoPalavra = idTipoPalavra;
this.nomeTipoPalavra = nomeTipoPalavra;
this.palavras = palavras;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id_tipo_palavra", nullable = false, unique = true, updatable=true)
public int getIdTipoPalavra() {
return this.idTipoPalavra;
}
public void setIdTipoPalavra(int idTipoPalavra) {
this.idTipoPalavra = idTipoPalavra;
}
@Column(name = "nome_tipo_palavra", nullable = false, length = 80)
public String getNomeTipoPalavra() {
return this.nomeTipoPalavra;
}
public void setNomeTipoPalavra(String nomeTipoPalavra) {
this.nomeTipoPalavra = nomeTipoPalavra;
}
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "tipoPalavras",cascade={CascadeType.ALL})
@Cascade(value={org.hibernate.annotations.CascadeType.ALL})
public Set<Palavra> getPalavras() {
return this.palavras;
}
public void setPalavras(Set<Palavra> palavras) {
this.palavras = palavras;
}
}
//classe onde capturo o texto e faço a inserção
public class PalavraUtil {
public static Hashtable<String, TipoPalavra> listpalavra = new Hashtable<String, TipoPalavra>();
public void palavra() {
Palavra palavra = new Palavra();
DaoGeneric daopalavra = new DaoGeneric();
try {
FileInputStream fstream = new FileInputStream("file/write.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
String tempo = null;
while ((strLine = br.readLine()) != null) {
if (strLine.contains(";")) {
String[] temp = strLine.split(";");
if(!listpalavra.containsKey(temp[0]))
{
TipoPalavra tipoPalavra2 = new TipoPalavra();
tipoPalavra2.setNomeTipoPalavra(temp[0]);
listpalavra.put(temp[0], tipoPalavra2);
daopalavra.inserirTipoPalavra(tipoPalavra2);
}
palavra = new Palavra();
palavra.setNomePalavra(temp[1]);
palavra.getTipoPalavras().add(listpalavra.get(temp[0]));
daopalavra.inserirPalavra(palavra);
continue;
}
if (strLine.equals("Presente do Indicativo")
|| strLine.equals("Imperfeito do Indicativo")
|| strLine.equals("Perfeito do Indicativo")
|| strLine.equals("Mais-que-perfeito do Indicativo")
|| strLine.equals("Futuro do Pretérito do Indicativo")
|| strLine.equals("Futuro do Presente do Indicativo")
|| strLine.equals("Presente do Subjuntivo")
|| strLine.equals("Imperfeito do Subjuntivo")
|| strLine.equals("Futuro do Subjuntivo")
|| strLine.equals("Imperativo Afirmativo")
|| strLine.equals("Imperativo Negativo")
|| strLine.equals("Infinitivo Pessoal")
|| strLine.equals("Substantivo")
|| strLine.equals("Adverbio")
|| strLine.equals("Adjetivo")) {
tempo = strLine;
if(!listpalavra.containsKey(strLine))
{
TipoPalavra TipoPalavra2 = new TipoPalavra();
TipoPalavra2.setNomeTipoPalavra(strLine);
listpalavra.put(strLine, TipoPalavra2);
daopalavra.inserirTipoPalavra(TipoPalavra2);
}
continue;
}
palavra = new Palavra();
palavra.setNomePalavra(strLine);
palavra.getTipoPalavras().add(listpalavra.get(tempo));
daopalavra.inserirPalavra(palavra);
//System.out.println("\n" + strLine.toLowerCase() + "\n");
}
in.close();
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
}
}
//classe main onde faço a bagaça rodar
public class App {
static final Log log = LogFactory.getLog(App.class);
public static void main(String[] args) {
try {
PalavraUtil palavraUtil = new PalavraUtil();
palavraUtil.palavra();
} catch (Exception e) {
log.info(e);
}
}
}
Desde já agradeço a ajuda de todos, e desculpe pelos erros sou iniciante em java e estou procurando aprender sempre mais
Vlw galera
exemplo de como são os dados que quero inserir
infinitivo;abafar
gerúndio;abafando
particípio;abafado
Presente do Indicativo
abafo
abafas
abafa
abafamos
abafais
abafam
Imperfeito do Indicativo
abafava
abafavas
abafava
abafávamos
abafáveis
abafavam
Perfeito do Indicativo
abafei
abafaste
abafou
abafamos
abafastes
abafaram
Mais-que-perfeito do Indicativo
abafara
abafaras
abafara
abafáramos
abafáreis
abafaram
Futuro do Pretérito do Indicativo
abafaria
abafarias
abafaria
abafaríamos
abafaríeis
abafariam
Futuro do Presente do Indicativo
abafarei
abafarás
abafará
abafaremos
abafareis
abafarão
Presente do Subjuntivo
abafe
abafes
abafe
abafemos
abafeis
abafem
Imperfeito do Subjuntivo
abafasse
abafasses
abafasse
abafássemos
abafásseis
abafassem
Futuro do Subjuntivo
abafar
abafares
abafar
abafarmos
abafardes
abafarem
Imperativo Afirmativo
abafa
abafe
abafemos
abafai
abafem
Imperativo Negativo
abafes
abafe
abafemos
abafeis
abafem
Infinitivo Pessoal
abafar
abafares
abafar
abafarmos
abafardes
abafarem
Ae Galera consegui fazer a correção, o pro era na minha DaoGeneric que não é generica né hhehehhehe, adicionei a pesquisa pela palavra que era repetida, ai qd era repetida eu simplesmente fazia um merge
log.info("Processando Palavra");
List cats = session.createCriteria(Palavra.class)
.add( Restrictions.like("nomePalavra", ""+palavra.getNomePalavra()+"") )
.list();
if(cats.isEmpty()){
log.info("Inserindo..... " + palavra.getNomePalavra());
session.save(palavra);
}else{
log.info("Atualizando..... " + palavra.getNomePalavra());
palavra = (Palavra) cats.get(0);
palavra.getTipoPalavras().add(tipoPalavra);
session.merge(palavra);
}
Bom vlw ae a ajuda !!! agora como eu faço para finalizar este tópico? hehheheh
Augusto,
Pra finalizar você coloca no título o prefixo [RESOLVIDO].
No seu caso fica: [RESOLVIDO] Inserção de dados não dúplicados.