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

时间:2014-04-19 12:40:28

标签: java google-app-engine jpa

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

    }

我的问题是,建立这种关系的最佳方式是什么?

谢谢

2 个答案:

答案 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。

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