Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [JAVA- JPA] @OneToMany

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347

    [JAVA- JPA] @OneToMany

    Buonasera a tutti,
    ho il seguente problema:
    Ho la classe Step

    codice:
    @Entity
    @Table(name = "STEP")
    public class Step implements Identifiable {
    	
    	@Id
    	@Column(name = "ID")
    	private long id;
    
    	@OneToMany(orphanRemoval = true, cascade = ALL, mappedBy = "notifyPK")
    	private Collection<Notify>	notifications;
    ...
    }
    e la classe Notify:

    codice:
    @Entity
    @Table(name = "NOTIFY")
    public class Notify implements Serializable {
    	@EmbeddedId
    	private NotifyPK	notifyPK;
    ...
    }
    che ha una chiave composta.

    La chiave composta di Notify è NotifyPK che l'ho realizzata così:
    codice:
      @Embeddable
      public class NotifyPK implements Serializable {
    
    	@Column(name = "ID_RECEIVER")
    	private String	idReceiver;
    
    	@Column(name = "ID_STEP")
    	private Long	idStep;
    
      public boolean equals(Object obj) {
       ...
      }
      public int hashCode() {
       ...
      }
    }
    Quando eseguo i miei test che vanno a creare le tabelle ed inserire dei dati, viene lanciata un'eccezione(riporto messaggio più significativo):
    Exception Description: An incompatible mapping has been encountered between [class test.Step] and [class test.Notify]. This usually occurs when the cardinality of a mapping does not correspond with the cardinality of its backpointer.

    Naturalmente è un problema di mapping per le chiavi composte infatti, inizialmente avevo realizzato Notify con chiave singola e non avevo nessun problema.
    Qualcuno mi sa dire dove sbaglio?

    P.S. naturalmente ID_STEP è referenziato ad ID ma ID_RECEIVER a chi lo devo referenziare?

    ringrazio
    nk

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ora come ora non ho tempo di verificare, ma prova a modificare la classe Notify in questo modo:

    codice:
    @Entity
    @Table(name = "NOTIFY")
    public class Notify implements Serializable {
        @EmbeddedId
        @AttributeOverrides({
           @AttributeOverride(name="idReceiver", column=@Column(name="ID_RECEIVER")),
           @AttributeOverride(name="idStep", column=@Column(name="ID_STEP"))
        })
        private NotifyPK    notifyPK;
    ...
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Puoi provare anche a specificare la colonna di join, aggiungendo un'annotazione nella classe Step:

    codice:
        @OneToMany(orphanRemoval = true, cascade = ALL, mappedBy = "notifyPK")
        @JoinColumn(name = "ID_STEP", nullable = false)
        private Collection<Notify>    notifications;
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    Buongriono,
    ho provato come mi hai consigliato ma continuo ad avere sempre lo stesso problema anche se sinceramente sembra ok.

    Però non mi è chiaro il tuo secondo post, perchè dovrei fare JoinColumn solo di ID_STEP?

    Utilizzando eclipse prospettiva jps, il tool ha la voce Joining Strategy, la quale va ad togliere mappedBy = "notifyPK" se seleziono JoinColumn.

    Continuo a lavoraci sopra e ti terrò aggiornayo

    Grazie
    nh

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da newhook
    Però non mi è chiaro il tuo secondo post, perchè dovrei fare JoinColumn solo di ID_STEP?
    Perchè nella classe Step hai un solo campo... l'ID, che dovrebbe essere quello che crea il legame con l'altra tabella.

    Sinceramente, io la JoinColumn non l'ho mai usata... ma non ho nemmeno mai avuto quel problema.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    Risolto!!!
    sto sviluppando con Eclipse ed utilizzavo eclipseLink2.1
    Questa libreria, sembra che abbia un bug e non riesce a creare tabelle con chiave doppia referenziate.
    Passando a eclipseLink2.3 la mia implementazione ha funzionato

    Ringrazio ancora per l'interessamento
    alla prossima
    nh

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ecco... io uso Hibernate...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    immaginavo...se non mi funzionava manco con la 2.3 avrei provato con Hibernate. Se l'errore persisteva ti avrei telefonato!
    troppo contento di aver risolto...stavo impazzendo
    cià!

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.