gpt4 book ai didi

jpa - @IdClass JPA 注释

转载 作者:行者123 更新时间:2023-12-04 17:59:30 32 4
gpt4 key购买 nike

这是我的一个实体的复合主键。

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();
}
}

这是我的实体(部分)使用上述作为复合主键。
@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) {
//

我对上述实体的equals方法实现应该是什么有点困惑。如何比较两个复合主键?

也欢迎对我的代码的其他部分提出任何意见。

最佳答案

将实体存储为主键不是一个好主意。使用查询语言时有一些限制,JPA 1.0 不支持。除此之外,不需要使用实体作为主键。想一想,如果你愿意,可以专门看下面这个问题

A class that behaves like @Entity and @Embeddable

Answer one

Comment about answer one

您将看到不需要使用实体作为主键。

代替

public class GroupMembershipPK implements Serializable {

private User user;
private Group group;

}


public class GroupMembershipPK implements Serializable {

private Integer userId;
private Integer groupId;

}

equals 实现很重要,因为 JPA 通过使用它来比较两个实体(JPA 通过使用 equals 实现检查实体是否在持久性上下文中)。所以你可以根据
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's 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

问候,

关于jpa - @IdClass JPA 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1468498/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com