【问题标题】:Persisting already persisted object within a relationship dependency在关系依赖中持久化已经持久化的对象
【发布时间】:2013-07-16 16:46:13
【问题描述】:

我在 Product 和 Order 之间有 n/n 关系 所以我有第三个表 ProductOrder,因为在创建新列时我需要它们。

public class Order implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ORDER_SEQ")
@Column(unique = true, nullable = false, updatable = false)
private Long idOrder;

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
private Set<ProductOrder> productOrder;
    //get and setter

这是 ProductOrder:

@Entity
@IdClass(ProductOrderId.class)
public class ProductOrder implements Serializable {

private static final long serialVersionUID = 3943799614725570559L;

@Id
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "product_id")
private Product product;

@Id
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "order_id")
private Order order;

private Integer qtdProduct;

private Double unitValueProductOrder;

//get and setter

还有我的 ProcutOrderId(以防万一)

public class ItemCompraId implements Serializable {

private Long compra;

private Long produto;

//get and set

和我的订单实体:

@Entity
@SequenceGenerator(name = "ORDER_SEQ", sequenceName = "s_compra", initialValue = 1, allocationSize = 1)
public class Order implements Serializable {

private static final long serialVersionUID = 3943799614725570559L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ORDER_SEQ")
@Column(unique = true, nullable = false, updatable = false)
private Long idOrder;

private Double orderValue;

private Date creatingDate;

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
private Set<ProductOrder> productOrder;

所以基本上我有任何产品已经保存在数据库中......当即将订购一些订单时,我刚刚得到了它们的列表。所以我想基于一些已经持久化的对象(产品)来持久化一个新的对象(订单)。这是在 managedbean 上调用以持久化 Order 的方法。

public String doOrder() throws Exception {

    try {
        Order order = new Order();
        compra.setCreatingDate(new Date());
        compra.setOrderValue(null);

        if (compra.getProductOrder() == null)
            compra.setProductOrder(new HashSet<ProductOrder>());
        for (Product product : listOfMyCartOfProducts) {

            ProductOrder productOrder = new ProductOrder();
            productOrder.setQtdProduct(100);
            productOrder.unitValueProductOrder(null);
            productOrder.setOrder(order);
            productOrder.setProduct(product); //I THINK THAT THE PROBLEM IT'S HERE

            order.getOrderProduct().add(productOrder);
        }

        ejbInvoke.persist(order); //tryed .merge and it doesn't work aswell

        return "stuff";

有什么想法吗? 我很绝望..我昨天需要这个工作.. 有什么帮助吗??

顺便说一句,我正在使用 JSF 2.0、Hibernate 与 JPA 2.0 和 Postgres。 问候,

【问题讨论】:

    标签: java hibernate jpa jboss


    【解决方案1】:

    您已将 order->productOrder->product 关系设置为级联持久化(包含在 cascadeType.ALL 中)。当您在 order 上调用 persist 时,实际上您也在 ProductOrder 和 Product 上调用 persist,如果它们中的任何一个已经存在于数据库中,则预计会引发异常。

    要么 1) 删除 productOrder->product 关系上的级联持久化选项,这样就不会调用持久化 - 如果您曾经通过新订单关联新产品,则必须手动调用持久化。
    2)使用产品pk调用em.find,将返回的实例关联到productOrder->product关系 3)使用 em.merge 代替,它将级联每个关系并自行决定实体是否存在或需要插入。这将导致在产品实例中所做的更改也会被合并。

    【讨论】:

    • 感谢您的回答,@Chris,但它没有用。我从 ProductOrder > Product 中删除了 Cascade Type ALL 并且没有用。试图用这个 FIND 对象(使用 EM)设置 ProductOrder > product 但没有用......它没有用......而且我已经尝试使用合并而不是持久化。也没有用...我不知道发生了什么...请帮助
    • 你能解释一下什么不起作用吗?有没有例外,数据不持久化吗?
    • 是的,数据没有持久化,因为我有一个回滚以防异常。是的,有异常,但是在这里发布太长了。错误 [stderr] (http--0.0 .0.0-8080-6)引起:org.hibernate.PersistentObjectException:分离实体传递给持久化:dom.product.entity.Product org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)错误在 org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
    • org.hibernate.tuple.entity.AbstractEntityTuplizer$IncrediblySillyJpaMapsIdMappedIdentifierValueMarshaller.getIdentifier(AbstractEntityTuplize r.java:491) 错误 org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:337.java:491) ) org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier (AbstractEntityPersister.java:4260) 错误 org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3982) org.hibernate.engine.internal 错误.ForeignKeys.isTransient(ForeignKeys.java:209)
    • org.hibernate.type.EntityType.replace(EntityType.java:283) 错误 org.hibernate.type.CollectionType.replaceElements(CollectionType.java:496) org.hibernate 错误。 type.CollectionType.replace(CollectionType.java:563) org.hibernate.type.AbstractType.replace(AbstractType.java:178) 错误 org.hibernate.type.TypeHelper.replaceAssociations(TypeHelper.java:261) 错误org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:590)
    猜你喜欢
    • 2011-11-28
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2018-01-21
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多