Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    16

    [Hibernate] relazione uno a molti

    Salve a tutti,
    mi sto approcciando ora a hibernate ammetto nona non senza delle difficolta data la mia scarsa e obsoleta preparazione in ambito db.

    Cio che vorrei fare è mappare una semplice classe Customer che contiene una List di oggetti Name come di seguito:

    codice:
    @Entity
    public class Customer implements Serializable{
    	@XmlAttribute(name="rid")
    	public String rid;
    	@XmlAttribute(name="simpleName")
    	public String simpleName;
    	@XmlElement(name = "name")
    	public List<Name> name;
    
    	@Id 
    	@GeneratedValue(generator="hibernate-uuid")
    	@GenericGenerator(name="hibernate-uuid", strategy = "uuid")
    	public String getRid() {
    		return rid;
    	}
    	
    	public String getSimpleName() {
    		return simpleName;
    	}
        
    	@OneToMany(targetEntity=Name.class, mappedBy="customer", cascade=CascadeType.ALL, fetch=FetchType.LAZY )
    	public List<Name> getName() {
    		return name;
    	}
    
    	public void setRid(String rid) {this.rid = rid;}
    	public void setSimpleName(String simpleName) {this.simpleName = simpleName;}
    	public void setName(List<Name> name) {this.name = name;}
    }
    codice:
    @Entity
    public class Name implements Serializable {
    	@XmlAttribute(name = "rid")
    	public String rid;
    	@XmlElement(name = "description")
    	public String description;
    	@XmlElement(name = "language")
    	public String language;
    	public Customer customer;
    	
    	@Id
    	@GeneratedValue(generator = "system-uuid")
    	@GenericGenerator(name = "system-uuid", strategy = "uuid")
    	public String getRid() {
    		return rid;
    	}
    
    	@ManyToOne
    	@JoinColumn(name = "name")
    	public Customer getCustomer() {
    		return customer;
    	}
    
    	public String getDescription() {return description;}
    	public String getLanguage() {return language;}
    
    	public void setRid(String rid) {this.rid = rid;}
    	public void setDescription(String description) {this.description = description;}
    	public void setLanguage(String language) {	this.language = language;}
    	public void setCustomer(Customer Customer) {this.customer = Customer;}
    }
    Cio che ottengo è:

    codice:
        create table Name (
            rid varchar(36) not null,
            description varchar(255),
            language varchar(255),
            name varchar(36),
            primary key (rid)
        )
    
        create table customer (
            rid varchar(36) not null,
            simpleName varchar(255),
            primary key (rid)
        )
    
        alter table Name 
            add index FK24EEAB295251 (name), 
            add constraint FK24EEAB295251 
            foreign key (name) 
            references customer (rid)
    A questo cerco di aggiungere un Customer al mio db...

    codice:
    	private static void newCustomer(){
    		Customer customer = new Customer();
    		ArrayList<Name> nameList = new ArrayList<Name>();
    		Name name = new Name();
    		name.setDescription("Duke");
    		name.setLanguage(Language.EN.toString());
    			nameList.add(name);
    		name.setDescription("Duca");
    		name.setLanguage(Language.IT.toString());
    			nameList.add(name);
    		name.setDescription("Ducas");
    		name.setLanguage(Language.DE.toString());
    			nameList.add(name);
    		
    		customer.setSimpleName("duke");
    		customer.setName(nameList);
    		 
    		dbEngine.createBean(DbSchemas.MANAGEMENT, customer);
    	}
    
    	public void createBean(DbSchemas dbSchemas, Object bean) {
    		DbConnector connector = getDbConnector(dbSchemas);
    		connector.getConfiguration().addAnnotatedClass(bean.getClass());
    		Transaction tx = null;
    		Session session = connector.getSessionFactoryUtil().getInstance().getCurrentSession();
    		connector.getSessionFactoryUtil().openSession();
    		try {
    			tx = session.beginTransaction();
    			session.save(bean);
    			tx.commit();
    		} catch (RuntimeException e) {
    			if (tx != null && tx.isActive()) {
    				try {
    					// Second try catch as the rollback could fail as well
    					tx.rollback();
    				} catch (HibernateException e1) {
    					System.out.println("Error rolling back transaction");
    				}
    				// throw again the first exception
    				throw e;
    			}
    		}
    	}
    ma ottengo:

    codice:
    Exception in thread "main" org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: migration.masterDataSet.management.contacts.Customer.name[migration.masterDataSet.management.contacts.Name]
    	at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1160)
    	at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:691)
    	at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:626)
    	at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66)
    	at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1586)
    	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1359)
    	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724)
    	at migration.hibernate.dBServices.SessionFactoryUtil.<init>(SessionFactoryUtil.java:27)
    	at migration.hibernate.dBServices.DbConnector.getSessionFactoryUtil(DbConnector.java:28)
    	at migration.hibernate.dBServices.DbEngine.createBean(DbEngine.java:119)
    	at migration.hibernate.dBServices.MigrationDbCreator.newCustomer(MigrationDbCreator.java:55)
    	at migration.hibernate.dBServices.MigrationDbCreator.main(MigrationDbCreator.java:22)
    Credo che il problema sia dato dal fatto che nella mia tabella Customer non esista di fatto una colonna name.
    Ho sbagliato qualcosa nell'implementazione oppure significa che devo io salvare gli oggetti name separatamente nella tabella Name e di conseguenza anche quando carichero un oggetto Customer dovro andare a caricare la List<Name> separatamente e settarla al suo customer?

    Potete aiutarmi a capire concettualmente dove sta l'errore...
    Grazie in anticipo per ogni aiuto.

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    16
    Mi vengono in mente alcune possibilita
    la domanda
    é troppo stupida (possibile)
    é scritta male (non credo... ma non si sa mai)
    é troppo difficile (improbabile)
    é postata nel posto sbagliato...

    qualche consiglio?

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non è che la domanda sia posta male, ma non hai usato i tag CODE per il codice, rendendolo praticamente illeggibile... li ho aggiunti io.

    Io direi che questa parte di codice è errata:

    codice:
    	private static void newCustomer(){
    		Customer customer = new Customer();
    		ArrayList<Name> nameList = new ArrayList<Name>();
    		Name name = new Name();
    		name.setDescription("Duke");
    		name.setLanguage(Language.EN.toString());
    			nameList.add(name);
    		name.setDescription("Duca");
    		name.setLanguage(Language.IT.toString());
    			nameList.add(name);
    		name.setDescription("Ducas");
    		name.setLanguage(Language.DE.toString());
    			nameList.add(name);
    		
    		customer.setSimpleName("duke");
    		customer.setName(nameList);
    		 
    		dbEngine.createBean(DbSchemas.MANAGEMENT, customer);
    	}
    Hai un solo oggetto "Name" e fai più "add()" nell'ArrayList... aggiungendo, di fatto, più volte lo stesso identico oggetto (non N oggetti, ma N volte lo stesso oggetto... il DB si arrabbia). Se ho minimamente capito ciò che vuoi fare, devi fare N volte la "new" dell'oggetto e, di conseguenza, gli N add().


    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
    Mar 2010
    Messaggi
    16
    ecco... 2 volte pirla...
    ero concentrato sulle annotations e mi sono perso
    Grazie mille

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    16
    Purtroppo il problema non è risolto credo che sia proprio legato al come ho scritto la relazione...

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Verifica che le due classi siano entrambe mappate nel file persistence.xml.
    Sembrerebbe che la classe Name non sia vista da Hibernate come una entità.


    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

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.