Hello, According to the docu I have regarding the jpa, you need to implement equals() & hashCode() in the embeddable. It also shows a constructor ...
public class DitaAdminSkillPK implements Serializable{ @ManyToOne @JoinColumn(name = "admin_id") private DitaAdmin admin; @ManyToOne @JoinColumn(name = "account_id") private DitaAccount account; public DitaAdminSkillPK(){ } public DitaAdminSkillPK(DitaAdmin admin, DitaAccount account){ this.admin = admin; this.account = account; } public boolean equals(Object o) { return ((o instanceof DitaAdminSkillPK) && admin.equals(((DitaAdminSkillPK) o).getAdmin()) && account.equals(((DitaAdminSkillPK) o).getAccount()); } public int hashCide() { return admin.hashCode() + account.hashCode(); } .... } Don't know if that will fix it for you, but it might be worth a try ! Cheers John > -----Ursprüngliche Nachricht----- > Von: Zbynek Vavros [mailto:zbynek_vav...@cz.ibm.com] > Gesendet: Montag, 13. August 2012 07:39 > An: users@openjpa.apache.org > Betreff: Composite key problem > > > Hi, > > Im having trouble with composite key and OpenJPA. > I was using hibernate so excuse my lack of OpenJPA knowledge. > > I have a table already created and one that I cannot modify : > > CREATE TABLE `admin_skills` ( > `admin_id` INT(11) NOT NULL, > `account_id` INT(11) NOT NULL, > `skill` INT(11) NOT NULL DEFAULT '5', > UNIQUE INDEX `account_id` (`account_id`, `admin_id`), INDEX > `admin_id` (`admin_id`), CONSTRAINT `admin_skills_ibfk_1` > FOREIGN KEY (`admin_id`) REFERENCES `admins` (`idadmin`) ON > UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT > `admin_skills_ibfk_2` FOREIGN KEY (`account_id`) REFERENCES > `account` (`account_id`) ON UPDATE CASCADE ON DELETE CASCADE > ) > > I have created following entity/key : > > @Entity > @Table(name = "admin_skills") > public class DitaAdminSkill { > > @EmbeddedId > private DitaAdminSkillPK id; > > @Column(name = "skill") > private Integer skill; > > //getters & setters > > @Embeddable > public class DitaAdminSkillPK implements Serializable{ > > @ManyToOne > @JoinColumn(name = "admin_id") > private DitaAdmin admin; > > @ManyToOne > @JoinColumn(name = "account_id") > private DitaAccount account; > > //getters & setters > > This works just fine with Hibernate 4.1.4Final : > > ApplicationContext applicationContext = new > ClassPathXmlApplicationContext(new String[] > {"applicationContext.xml", "db_beans.xml"}); > DitaAdminSkillDao dispDao = applicationContext.getBean > (DitaAdminSkillDao.class); > List<DitaAdminSkill> disp = dispDao.findAll(); > System.out.println(disp.get(0).getId().getAccount()); > > > But when I try to run this with OpenJPA I get an error : > Unknown column 't0.id' in 'field list' > Seems like it is ignoring the @EmbeddedId annotation and > tries to select directly the ID, which do not exists. > I have been trying to use @IdClass instead but with pretty > much same result :( > > Since OpenJPA has general lack of support/forums/everything, > I wasnt able to find anything useful through google. > > If anyone has any comments, please, it will be more than welcomed. > > Oh, and I am using OpenJPA 2.1.5 with Maven (tried > 2.2.0-SNAPSHOT but does the same) : > > <!-- Apache implementation of JPA2.0 --> <dependency> > <groupId>org.apache.openjpa</groupId> > <artifactId>openjpa-all</artifactId> > <version>2.1.5</version> > </dependency> > > Thanks !!!! > > >