Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [MySql+JavaEE] Problemi con delete e vincoli di integrità. AIUTO!

    Ciao a tutti,
    sto realizzando un'applicazione con Java Enterprise. In questo mio progetto faccio uso di un database. Per mappare le varie tabelle del mio database ho fatto uso delle classi Entity.
    Il mio problema sta quando cerco di eliminare una tupla della tabella Inserzione(di seguito il codice della classe Entity)
    @Entity
    public class Inserzione implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private String codice_inserzione;
    @ManyToOne
    @JoinColumn(referencedColumnName="USERNAME")
    private Rivenditore rivenditore;
    @ManyToOne
    @JoinColumn(referencedColumnName="CODICE")
    private Chitarra chitarra;
    @Column(name="COSTO")
    private double costo;
    @Column(name="PREZZO")
    private double prezzo;
    @Column(name="STATO")
    private String stato;

    Il problema viene dal fatto che ho un'altra classe chiamata Cliente(sotto il codice) che ha un riferimento con la classe Inserzione.

    @Entity
    public class Cliente implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private String username;
    private String password;
    private String nome;
    private String cognome;
    private String citta;
    private String indirizzo;
    @OneToMany(fetch=FetchType.LAZY)
    private Collection<Inserzione> inserzioniOsservate;

    Di seguito riporto l'eccezione:

    Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.DatabaseExcep tion
    Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityCons traintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`onlyguitarshop`.`cliente_inserzione`, CONSTRAINT `CLENTEINSERZIONEnserzioniOsservateCODICEINSERZION E` FOREIGN KEY (`inserzioniOsservate_CODICE_INSERZIONE`) REFERENCES `inserzione` (`CODICE_IN)

    COSA DEVO FARE????? Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    105
    Ciao, questo a foreign key constraint fails suona molto come una constrain a livello db, controlla che non c e ne siano. Con il client mysql query browser lo vedi subito.

    Domanda
    Usi hibernate o e un EJB??

  3. #3
    Stai tentando di cancellare un inserzione che è referenziata da un altra tabella (cliente) tramite una foreign key, il database ovviamente non te lo permette, devi prima cancellare tutti i riferimenti, poi l'inserzione.

    Hibernate ti permette di farlo automaticamente e credo anche in JPA Toplink, andando a naso prova a cambiare

    @OneToMany(fetch=FetchType.LAZY)

    con

    @OneToMany(fetch=FetchType.LAZY,cascade=CascadeTyp e.REMOVE)

    altrimenti lo puoi impostare da mysql, vedi http://dev.mysql.com/doc/refman/5.1/...nstraints.html sotto la voce "cascade".

    altrimenti devi farlo a mano.

  4. #4
    Grazie per aver risposto,
    Ho risolto il problema cambiando da mysql la proprietà delete rule in cascade.
    Avevo provato ad impostare l'attributo cascade così
    @OneToMany(fetch=FetchType.LAZY,cascade=CascadeTyp e.REMOVE)
    però non ha funzionato.

  5. #5
    scusate... altra piccola domanda...
    cosa c'è che non va in questa query??

    "SELECT a FROM Acquisto a WHERE a.inserzione IN (SELECT i FROM Inserzione i WHERE i.rivenditore = :rivenditore)"

    questo è l'errore:

    Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorEx ception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN (SELECT t2.CODICE_INSERZIONE, t2.PREZZO, t2.STATO, t2.COSTO, t2.RIVENDITORE_U' at line 1
    Error Code: 1064
    Call: SELECT t0.CODICE_ACQUISTO, t0.DATA_ACQUISTO, t0.FEEDBACK, t0.CLIENTE_USERNAME, t0.INSERZIONE_CODICE_INSERZIONE FROM ACQUISTO t0, INSERZIONE t1 WHERE ( IN (SELECT t2.CODICE_INSERZIONE, t2.PREZZO, t2.STATO, t2.COSTO, t2.RIVENDITORE_USERNAME, t2.CHITARRA_CODICE FROM INSERZIONE t2 WHERE (t2.RIVENDITORE_USERNAME = ?)) AND (t1.CODICE_INSERZIONE = t0.INSERZIONE_CODICE_INSERZIONE))
    bind => [guitarseller]

    dice che è un errore di sintassi, ma penso che la sintassi sia giusta.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    105
    i.rivenditore é un varchar????

    xke se cosi fosse dovrebbe essere

    codice:
    "SELECT a FROM Acquisto a WHERE a.inserzione IN (SELECT i FROM Inserzione i WHERE i.rivenditore = 'rivenditore')"
    and

    SELECT a FROM Acquisto a vuole dire poco.. al max SELECT a.* FROM Acquisto a

  7. #7
    a me servono tutti gli attributi della tupla Inserzione quindi "SELECT a FROM Acquisto a" per me ha senso.
    i.rivenditore è un varchar, in particolare fa riferimento alla primary key della tabella Rivenditore.
    non posso mettere la query che mi hai suggerito
    "SELECT a FROM Acquisto a WHERE a.inserzione IN (SELECT i FROM Inserzione i WHERE i.rivenditore = 'rivenditore')"

    perchè :rivenditore sta ad indicare un valore che io do in ingresso. Io passo alla query un oggetto di tipo Rivenditore tramite le NamedQuery. Sotto c'è il codice:

    Rivenditore r = em.find(Rivenditore.class, username);
    Query query = em.createNamedQuery("trovaAcquistiPerRivenditore") ;
    query.setParameter("rivenditore", r);
    acquisti = query.getResultList();

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    105
    k
    pero io di solito faccio select * from A a non select a from A a. di fatto se la provi in mysql qb ti da errore.

  9. #9
    si, infatti io sto usando EJB QL.

  10. #10
    perchè fai "where .. in (sottoquery) ? se il tuo mapping è corretto usa un inner join

    SELECT a FROM Acquisto a JOIN a.inserzione AS i WHERE i.rivenditore = :rivenditore

    non sò se è 100% corretta perchè conosco HQL e non EJB QL ma dovrebbe essere simile.

    in HQL (con mapping corretto) e forse anche EJB QL potresti fare anche così

    SELECT a FROM Acquisto a WHERE a.inserzione.rivenditore = :rivenditore

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.