持续更改涉及无主关系的实体的问题

时间:2015-10-13 15:31:29

标签: java google-app-engine jpa google-cloud-datastore

我正在开发一个GWT + AppEngine应用程序,它在开发环境中运行良好。但是当我将它部署到GAE时,出现了一个奇怪的问题。

以下代码(当然简化)显示了涉及的JPA实体。 产品实体拥有名为 ProductSubscription 的中间实体。这反过来包含对无主实体订阅的引用,其中包含折扣实体的拥有列表。 Subscription是无主的原因是我需要多个产品与同一个订阅相关联。

@Entity
public class Product
{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Key key;

    // Product subscription details
    @OneToOne(cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.EAGER)
    private ProductSubscription productSubscription;
}


@Entity
public class ProductSubscription
{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Key key;

    @Basic(fetch=FetchType.EAGER)
    @Unowned
    private Subscription subscription;

    @OneToOne(optional=false, mappedBy="productSubscription", targetEntity=Product.class, fetch=FetchType.LAZY)
    private Product product;
}


@Entity
public class Subscription
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    @OneToMany(cascade=CascadeType.ALL, mappedBy="subscription", orphanRemoval=true, fetch=FetchType.EAGER)
    private List<Discount> discounts;
}


@Entity
public class Discount
{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Key key;

    @ManyToOne(optional=false, targetEntity=Subscription.class, fetch=FetchType.LAZY)
    private Subscription subscription;
}

在我的工作流程中,我创建了Subscription对象及其折扣。然后在单独的事务中,我通过LicenseSubscription将订阅与产品相关联。

当我对Product进行更改并将其保留时,会出现问题:折扣从Subscription中消失!这意味着实体会自动从数据存储中删除。 任何人都可以解释我做错了什么?我的假设是,当我使用无主关系时,对Product或ProductSubscription对象的任何更改都不会对Subscription产生影响(实际上一切都在dev中工作正常)。

任何帮助都将受到赞赏,因为我现在卡住了。感谢。

1 个答案:

答案 0 :(得分:1)

原来,在更新产品时,为了评估要应用的折扣,我正在对折扣集合进行排序,如下所示:

Collections.sort(discounts, Discount.DESCENDING_COMPARATOR);

现在我在Subscription实体的列表声明中将其更改为更合适的@OrderBy语句,一切正常。

我仍然很想知道为什么排序会导致所有折扣从订阅中删除,因此对此的任何评论都将受到赞赏。感谢。