我有2个实体,它们之间有关系。
这两个实体已经创建并插入到数据库中。 在某些时候,用户可以在它们之间进行连接。 当我尝试这样做时:
javax.persistence.PersistenceException:检测到尝试建立 WannaMeetUser(" 654321")作为WannaMeetUser的父母(" 123456")但是 WannaMeetUser(" 123456")确定的实体已经存在 坚持没有父母。无法建立或更改父母 一旦对象被持久化。
这是一种传递关系(用户可以拥有许多来自用户之王的朋友):
附上代码:
@Entity
public class WannaMeetUser {
@Id //signifies the primary key
@Column(name = "ID", nullable = false)
private Key id;
@ManyToMany
@Basic
private List<WannaMeetUser> userFriends = new ArrayList<WannaMeetUser>();
}
public void addFriendToWannaMeetUser(@Named("userId") String userId,
@Named("friendId") String friendId) {
EntityManager mgr = getEntityManager();
try
{
WannaMeetUser user = mgr.find(WannaMeetUser.class, WannaMeetServerUtils.getKeyFromString("WannaMeetUser", userId));
WannaMeetUser friend = mgr.find(WannaMeetUser.class, WannaMeetServerUtils.getKeyFromString("WannaMeetUser", friendId));
String coupleId = getcoupleId(userId.toString(), friendId.toString());
if (friend == null || user == null) {
throw new EntityNotFoundException("Object does not exist");
}
WannaMeetCouple couple=mgr.find(WannaMeetCouple.class, coupleId);
if (couple == null) {
couple = createCouple(userId.toString(), friendId.toString());
couple.setId(coupleId);
setUserJoined(couple, userId.toString(), friendId.toString(), true);
}
else {
if (isFriendAllready(couple, userId.toString(), friendId.toString()))
;
setUserJoined(couple, userId.toString(), friendId.toString(), false);
doAddFriend(user, friend, 10, 12321321);
mgr.persist(couple);
mgr.persist(friend);
mgr.persist(user);
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
mgr.close();
}
}
我的问题是,建立这种关系的最佳方式是什么?
谢谢
答案 0 :(得分:0)
消息说用户1已经被持有而没有任何父母,但现在我们尝试 将用户2持久化为用户1的父节点,但已知用户1没有父节点。
尝试使用级联来一次性保留所有内容。您可以声明如下的级联关系:
@ManyToMany(cascade=CascadeType.ALL)
private List<User> userFriends;
然后使用级联来持续一切:
User user1 = new User();
User user2 = new User();
user1.getUserFriends().add(user2);
// this persists the whole tree in one go
entityManager.persist(user1);
答案 1 :(得分:0)
父子实体应仅用于永不改变的关系(例如用户及其照片)。对于动态关系,您有三种选择:
(A)将对其他对象的引用存储为属性(例如,用户实体中的userFriends属性)。如果关系是单向的(例如,用户A喜欢用户B),那么您只能更新一个实体。对于双向关系,您可以更新两个实体。
(B)创建一个新的实体类型与两个属性User A和User B的关系。根据需要创建和删除这些实体。
(C)当用户A喜欢用户B时,创建一个新的实体Relationship作为用户A的子实体,并使用用户B的id作为这个新关系实体的id。
这些选项之间的选择取决于您的数据模型和数据访问模式。