How to make a composite primary key which consist of a PK of other table as FK

151 views Asked by At

I am working on JPA with toplink and want to create Entity class. I want to use Table A's (alias) PK as part of foreign key in Table B's composite primary key (message). I have created following structure for the Entity. But i see the join column is null and show null in table.

@Embeddable
public class MessageEntityPK implements Serializable {
    private static final long serialVersionUID = -229800894330529492L;
    private String messageSubject;
    private String aliasName;

    public String getMessageSubject() {
        return messageSubject;
    }

    public String getAliasName() {
        return aliasName;
    }

    public MessageEntityPK() {

    }

    public MessageEntityPK(String msgSubject, String aliasName) {
        this.aliasName = aliasName;
        this.messageSubject = msgSubject;
    }
}

@Entity
@Table(name = "ALIAS_ENTITY")
public class AliasEntity {
    @Id
    private String aliasName;
    private String aliasPath;

    public String getAliasName() {
        return aliasName;
    }

    public void setAliasName(String aliasName) {
        this.aliasName = aliasName;
    }

    public String getAliasPath() {
        return aliasPath;
    }

    public void setAliasPath(String aliasPath) {
        this.aliasPath = aliasPath;
    }

    //hashCode and equals Function.

}


@Entity
public class MessageEntity {
    @EmbeddedId
    private MessageEntityPK messageEntityID;

    @ManyToOne
    @MapsId("aliasName")
    @JoinColumn(name = "Alias_Name", referencedColumnName = "aliasName")
    private AliasEntity aliasEntity;

    public MessageEntityPK getMessageEntityID() {
        return messageEntityID;
    }

    public void setMessageEntityID(MessageEntityPK messageEntityID) {
        this.messageEntityID = messageEntityID;
    }

    public AliasEntity getAliasEntity() {
        return aliasEntity;
    }

    public void setAliasEntity(AliasEntity aliasEntity) {
        this.aliasEntity = aliasEntity;
    }

}

Table:

| ALIASNAME      | varchar(255) | NO   | PRI | NULL    |       | 
| MESSAGESUBJECT | varchar(255) | NO   | PRI | NULL    |       | 
| Alias_Name     | varchar(255) | YES  | MUL | NULL    |       |
+----------------+--------------+------+-----+---------+----‌​---+
1

There are 1 answers

2
Vitalii Kravchenko On

Seems to me annotation ordering matter, put @MapsId first. Take a look to the reference http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e4865