Java 为父实体JPA-GAE分配现有子实体

Java 为父实体JPA-GAE分配现有子实体,java,google-app-engine,jpa,Java,Google App Engine,Jpa,我有两个实体,它们之间有关系 这两个实体都已创建并插入到数据库中。 在某些情况下,用户可以在它们之间建立连接。 当我尝试这样做时,我得到: javax.persistence.PersistenceException:检测到试图建立 WannaMeetUser(“654321”)作为WannaMeetUser(“123456”)的母公司,但 由WannaMeetUser(“123456”)标识的实体已被删除 在没有父对象的情况下持续存在。无法建立或更改父级 一旦对象被持久化 这是一种传递关系(用

我有两个实体,它们之间有关系

这两个实体都已创建并插入到数据库中。 在某些情况下,用户可以在它们之间建立连接。 当我尝试这样做时,我得到:

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

    }
@实体
公共类WannaMeetUser{
@Id//表示主键
@列(name=“ID”,nullable=false)
私钥id;
@许多
@基本的
private List userFriends=new ArrayList();
}
public void addFriendToWannaMeetUser(@Named(“userId”)字符串userId,
@命名(“friendId”)字符串(friendId){
EntityManager mgr=getEntityManager();
尝试
{
WannaMeetUser user=mgr.find(WannaMeetUser.class,WannaMeetServerUtils.getKeyFromString(“WannaMeetUser”,userId));
WannaMeetUser-friend=mgr.find(WannaMeetUser.class,WannaMeetServerUtils.getKeyFromString(“WannaMeetUser”,friendId));
字符串coupleId=getcoupleId(userId.toString(),friendId.toString());
if(friend==null | | user==null){
抛出新EntityNotFoundException(“对象不存在”);
}
wannameetcolp=mgr.find(wannameetcolp.class,coupleId);
if(couple==null){
couple=createCouple(userId.toString(),friendId.toString());
couple.setId(coupleId);
setUserJoined(couple,userId.toString(),friendId.toString(),true);
}
否则{
if(isFriendAllready(耦合,userId.toString(),friendId.toString())
;
setUserJoined(耦合,userId.toString(),friendId.toString(),false);
doAddFriend(用户,朋友,1012321321);
经理(夫妇);
经理(朋友);
经理(用户);
}
}捕获(例外e){
e、 printStackTrace();
}
最后{
经理关闭();
}
}
我的问题是,建立这种关系的最佳方式是什么


谢谢

消息说用户1已经被持久化,没有任何父项,但是现在我们尝试了 将用户2持久化为用户1的父级,但已知用户1没有父级

尝试使用级联将所有内容一次性持久化。您可以这样声明级联关系:

@ManyToMany(cascade=CascadeType.ALL)
private List<User> userFriends;

父子实体应仅用于永不改变的关系(例如,用户及其照片)。对于动态关系,您有三个选项:

(A) 将对其他对象的引用存储为属性(例如,用户实体中的userFriends属性)。如果关系是单向的(例如,用户a喜欢用户B),则只能更新一个实体。对于双向关系,可以同时更新两个实体

(B) 创建具有两个属性用户a和用户B的新实体类型关系。根据需要创建和删除这些实体

(C) 当用户A喜欢用户B时,创建一个新的实体关系作为用户A的子实体,并使用用户B的id作为此新关系实体的id


这些选项之间的选择取决于您的数据模型和数据访问模式。

谢谢您的评论,但在用户创建过程中,这种关系是未知的,因此您的建议与我无关。谢谢您的帮助,关于选项A,您的意思是使用没有@manytomy注释的属性吗?我不熟悉JPA如何映射到数据存储API。看看
User user1 = new User();
User user2 = new User();

user1.getUserFriends().add(user2);

// this persists the whole tree in one go
entityManager.persist(user1);