JPA需要在独立于CascadeType.REFRESH的实体上显式.refresh吗?

时间:2011-10-09 09:30:42

标签: jpa entity refresh cascade

为什么我的CascadeType.REFRESH实际上没有刷新我的实体?添加对象时,它不会更新集合(仍为空)。

我需要显式调用entity.refresh()!这是我的部分代码(其中.ALL可以替换为.REFRESH,.PERSIST):

@Entity
public class Event extends Model {
    @OneToMany(mappedBy="event", cascade=CascadeType.ALL)
    public List<Invitation> invitations;
}

@Entity
public class Invitation extends Model 
{
    @ManyToOne(cascade=CascadeType.ALL)
    public Event event;
}


// ..
        Event event = new Event(/* ... */);
        event.save();

        if (invitationid > 0)
        {
            Logger.info("Invitation added to event");
            Invitation invite = Invitation.findById(invitationid);
                invite.event = event;
                invite.save();
        }

        // Explicit calling this, will actually do refresh the object and show the invite.
        // event.refresh();

        if (event.invitations == null || event.invitations.size() == 0)
            Logger.info("Still null?!");
// ..

我在玩!似乎与hibernate-jpa-2.0一起发布的框架。

1 个答案:

答案 0 :(得分:2)

负责对象图的一致性。保存孩子时,JPA不会自动将孩子添加到父母的集合中。因此,你有责任做

Invitation invitation = new Invitation();
invitation.setEvent(event);
event.getInvitations().add(invitation);

将它封装在addInvitation类的Event方法中更好:

public void addInvitation(invitation) {
    this.invitations.add(invitation);
    invitation.setEvent(this);
}