Newsgroup: it.comp.java
Titolo: Problema salvataggio con chivi composite

Un saluto a tutti! ;)
Utilizzo Seam 2.0.2.SP1, 
jboss-4.2.2.GA
 and oracle 10i. Queste sono le
mie classi (tutte generate con Hibernate Tools 3.2.0.b9).
CLASS ACCOUNT:
@Entity
@Table(name = "ACCOUNT")
public class Account implements java.io.Serializable {
        private long progAccountId;
        private String userid;
        private String password;
        private String nome;
        private String cognome;
        private Date dataNascita;
        private Long userInsert;
        private Date dateInsert;
        private Long userModify;
        private Date dateModify;
        private Long userDelete;
        private Date dateDelete;
        private Date dateModifyPwd;
        private Set<SecurityLog> securityLogs = new
HashSet<SecurityLog>(0);
        private Set<UtentiConnessi> utentiConnessis = new
HashSet<UtentiConnessi>(0);
        private Set<AccountProfile> accountProfiles = new
HashSet<AccountProfile>(0);
        //...other method
        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY,
mappedBy = "account")
        public Set<AccountProfile> getAccountProfiles() {
                return this.accountProfiles;
        }
        public void setAccountProfiles(Set<AccountProfile>
accountProfiles) {
                this.accountProfiles = accountProfiles;
      }
}
CLASS ACCOUNT-PROFILE: tabella di pivot tra Account e Profile
@Entity
@Table(name = "ACCOUNT_PROFILE")
public class AccountProfile implements java.io.Serializable {
	private AccountProfileId id;
	private Account account;
	private Profile profile;
	private Long userInsert;
	private Date dateInsert;
	private Long userModify;
	private Date dateModify;
	private Long userDelete;
	private Date dateDelete;
	//...other method
	@EmbeddedId
	@AttributeOverrides( {
			@AttributeOverride(name = "progProfileId", column = @Column(name =
"PROG_PROFILE_ID", nullable = false, precision = 10, scale = 0)),
			@AttributeOverride(name = "progAccountId", column = @Column(name =
"PROG_ACCOUNT_ID", nullable = false, precision = 10, scale = 0)) })
	public AccountProfileId getId() {
		return 
this.id
;
	}
	public void setId(AccountProfileId id) {
 
this.id
 = id;
	}
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "PROG_ACCOUNT_ID", nullable = false, insertable =
false, updatable = false)
	public Account getAccount() {
		return this.account;
	}
	public void setAccount(Account account) {
		this.account = account;
	}
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "PROG_PROFILE_ID", nullable = false, insertable =
false, updatable = false)
	public Profile getProfile() {
		return this.profile;
	}
	public void setProfile(Profile profile) {
		this.profile = profile;
	}
}
CLASS ACCOUNT-PROFILE-ID: classe ID di Account-Profile
@Embeddable
public class AccountProfileId implements java.io.Serializable {
	private long progProfileId;
	private long progAccountId;
	public AccountProfileId() {
	}
	public AccountProfileId(long progProfileId, long progAccountId) {
		this.progProfileId = progProfileId;
		this.progAccountId = progAccountId;
	}
	@Column(name = "PROG_PROFILE_ID", nullable = false, precision = 10,
scale = 0)
	public long getProgProfileId() {
		return this.progProfileId;
	}
	public void setProgProfileId(long progProfileId) {
		this.progProfileId = progProfileId;
	}
	@Column(name = "PROG_ACCOUNT_ID", nullable = false, precision = 10,
scale = 0)
	public long getProgAccountId() {
		return this.progAccountId;
	}
	public void setProgAccountId(long progAccountId) {
		this.progAccountId = progAccountId;
	}
	public boolean equals(Object other) {
		if ((this == other))
			return true;
		if ((other == null))
			return false;
		if (!(other instanceof AccountProfileId))
			return false;
		AccountProfileId castOther = (AccountProfileId) other;
		return (this.getProgProfileId() == castOther.getProgProfileId())
				&& (this.getProgAccountId() == castOther.getProgAccountId());
	}
	public int hashCode() {
		int result = 17;
		result = 37 * result + (int) this.getProgProfileId();
		result = 37 * result + (int) this.getProgAccountId();
		return result;
	}
}
Utilizzo la classe EntityHome per Account a cui ho aggiunto un metodo
per inserire un nuovo Account (con i relativi profili), questa è una
porzione del codice:
Date currentDate = new Date(System.currentTimeMillis());
Account account =createInstance();
account.setUserid(username);
account.setPassword(encryptPsw);
account.setNome(firstName);
account.setCognome(lastName);
account.setDataNascita(dateBirth);
account.setUserInsert(accountLogged.getProgAccountId());
account.setDateInsert(currentDate);
account.setUserModify(accountLogged.getProgAccountId());
account.setDateModify(currentDate);
account.setDateModifyPwd(currentDate);
AccountProfile accountProfile;
//profiles è una lista di Profili passat da input
for (Profile prof : profiles) {
accountProfile = new AccountProfile();
AccountProfileId accProfID = new
AccountProfileId(prof.getProgProfileId(), account.getProgAccountId());
								accountProfile.setAccount(account);
accountProfile.setProfile(prof);
accountProfile.setId(accProfID);
accountProfile.setUserInsert(accountLogged.getProgAccountId());
accountProfile.setDateInsert(currentDate);
accountProfile.setUserModify(accountLogged.getProgAccountId());
accountProfile.setDateModify(currentDate);
account.getAccountProfiles().add(accountProfile);
}// for (Profile prof : profiles)
setInstance(account);
persist();
L'ID per la classe account è assegnato automaticamente tramite una
sequenza di oracle, così non posso sapere quale sarà il valore. Quando
salvo l'Account ho il seguente errore:
[quote]javax.persistence.PersistenceException:
org.hibernate.NonUniqueObjectException: a different object with the
same identifier value was already associated with the session:
[it.poste.pinats.security.ejb.entities.AccountProfile#it.poste.pinats.security.ejb.entities.AccountProfileId@5b0e]
[/quote]
Penso che il problema sia nell'inizializzazione dell'id della classe
Account_Profile:
[quote]AccountProfileId accProfID = new
AccountProfileId(prof.getProgProfileId(), account.getProgAccountId());
[/quote]
perchè l'id dell'Account è 0 perchè non ancora assegnato dalla
sequenza.
Come si possono configurare le classi in modo che l'id
dell'Account_Profile è assegnato dalla sequenza prima del salvataggio?

 [/quote]
Semplifica l'esempio e produci un SSCCE.
Poi se non trovi la soluzione posta lo SSCCE.
Io di solito specifico che gli ID devono essere autogenerati.
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     public Long getId() {
         return id;
     }
Non so se questo si applica al tuo caso perché l'esempio è troppo 
incasinato per capirlo dandogli solo un'occhiata.
Cercati un esempio di uso di EmbeddedId su Google, scaricatelo, fallo 
funzionare e trasformalo pian piano in quello che ti serve.
-- 
Andrea Francia
http://www.andreafrancia.it/