@IdClass JPA Abstract

Here is a composite primary key for one of my objects.

public class GroupMembershipPK implements Serializable{

    private static final long serialVersionUID = 7816433876820743311L;

    private User user;
    private Group group;

    public GroupMembershipPK(){
    }

    public boolean equals(Object o){
        if(o==null){
            return false;
        }

        if(o instanceof GroupMembershipPK){
            final GroupMembershipPK groupMembershipPK=(GroupMembershipPK)o;
            return groupMembershipPK.group.getGroupName().equals(this.group.getGroupName()) &&
                groupMembershipPK.user.getName().equals(this.user.getName());
        }
        return false;
    }

    public int hashCode(){
        return super.hashCode();
    }
}

Gets my entity (part) using the above as a composite primary key.

@Entity
@IdClass(GroupMembershipPK.class)
public class GroupMembership extends AbstractModelElementVersionOther{

    private static final long serialVersionUID = 9188465566607060376L;

    private String memType;
    private Group group;
    private User user;

    public GroupMembership(){
        super();
    }

    @Column(nullable=false)
    public String getMemType(){
        return this.memType;
    }

    public void setMemType(String memType){
        this.memType=memType;
    }

    @Id
    @ManyToOne
    @JoinColumn(name="groupId")
    public Group getGroup(){
        return this.group;
    }

    public void setGroup(Group group){
        this.group=group;
    }

    @Id
    @ManyToOne
    @JoinColumn(name="userId")
    public User getUser(){
        return this.user;
    }

    public void setUser(User user){
        this.user=user;
    }

    @Override
    public boolean equals(Object o) {
//

I am a bit confused about what should be the implementation of the equals method for the above object. How to compare two composite primary keys?

Any comments on other parts of my code are also welcome.

+5
source share
2 answers

It is not recommended to store objects as a primary key. There are some limitations to using the query language, and JPA 1.0 does not support it. In addition, there is no need to use entities as the primary key. Think about it. If you want, pay particular attention to the following question.

, @Entity @Embeddable

, .

public class GroupMembershipPK implements Serializable {

    private User user;
    private Group group;

}

public class GroupMembershipPK implements Serializable {

    private Integer userId;
    private Integer groupId;

}

, JPA , (JPA , , ). ,

public boolean equals(Object o) {
    if(o == null)
        return false;

    if(!(o instanceof GroupMembershipPK))
        return false;

    GroupMembershipPK other = (GroupMembershipPK) o;
    if(!(getUserId().equals(other.getUserId()))
        return false;

    if(!(getGroupId().equals(other.getGroupId()))
        return false;

    return true;
}

. , JPA - - . - , JPA .

, ?

User user = new user();
Group group = new Group();

entityManager.save(user);
entityManager.save(group);

entityManager.flush();

UserGroup userGroup = new UserGroup();

userGroup.setId(new UserGroup.UserGroupId(user.getId(), group.getId()));

entityManager.save(userGroup);

, UserGroup?

public class UserGroup {

    private UserGroupId id;

    // You can create UserGroupId outside UserGroup class
    // Feel free to choice your best approach
    @Embeddable
    public static class UserGroupId implements Serializable {

        private Integer userId;
        private Integer groupId;

        // required no-arg constructor
        public UserGroupId() {}

        public UserGroupId(Integer userId, Integer groupId) {
            this.userId = userId;
            this.roupId = groupId;
        }

        // getter and setter's

        // equals and hashcode as shown above

    }

    @EmbeddedId
    public UserGroupId getId() {
        return this.id;
    }

    public setId(UserGroupId id) {
        this.id = id;
    }
}

IdClass. . IdClass

,

+7

, :

  • equals instanceof, . Hibernate lazy , . - . .
    .
  • name.equals(that.name) name.equals(that.getName()). , .

http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html

+1

All Articles