我正在开发一个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中工作正常)。
任何帮助都将受到赞赏,因为我现在卡住了。感谢。
答案 0 :(得分:1)
原来,在更新产品时,为了评估要应用的折扣,我正在对折扣集合进行排序,如下所示:
Collections.sort(discounts, Discount.DESCENDING_COMPARATOR);
现在我在Subscription实体的列表声明中将其更改为更合适的@OrderBy语句,一切正常。
我仍然很想知道为什么排序会导致所有折扣从订阅中删除,因此对此的任何评论都将受到赞赏。感谢。