principal_id permission target 12312313 PERM1 1000 12312313 PERM2 1000 12312313 PERM2 1002 @Entity ... public class Principal { @Id private long principalId; ... private Map> permissionMap; } @Entity ... public class Principal { @Id private long principalId; /** Other properties **/ @OneToMany private Set permissions; .... } @Entity @IdClass(PermissionId.class) public class Permission { @Id private String permission; @Id private Long target public static class PermissionId implements Serializable { private String permission; private Long target; /** setters/getters hashcode and equals goes here **/ } } @Embeddable public class Permission { private String permission; private int target; } @ElementCollection @CollectionTable(name="foo", joinColumns = @JoinColumn(name = "principal_id")) private Set permissions; @ElementCollection @CollectionTable(name="foo", joinColumns = @JoinColumn(name = "principal_id")) @MapKeyColumn(name="permission") @Column(name="target") private Map permissions;