org.hibernate.TransientObjectException:object引用未保存的瞬态实例

时间:2016-05-14 18:37:01

标签: entity-framework hibernate jpa

我正在尝试在名为Person和Address的两个实体之间建立单向关系,同时保存Person(包含Address的集合)获取org.hibernate.TransientObjectException:object引用未保存的瞬态实例。

当我更改cascadeType = all时,子对象正在传播。但这里的问题是cascadeType =所有Hibernate也试图删除删除所有实体上的子实体。我不希望这种情况发生,因为在ManyToMany关系中某个其他实体可能正在引用实体。理想情况下,cascadeType = persist应该可以完成这项工作,但不幸的是,这会让我提到异常。

有人可以帮我解决如何使用cascadeType = persist保存子对象(地址)。我只是想知道为什么cascadeType = persist不执行持久化任务。

public class Person {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private String name;



    @LazyCollection(LazyCollectionOption.FALSE)

    @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE})
    private Collection<Address> address=new HashSet<Address>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Collection<Address> getAddress() {
        return address;
    }

    public void setAddress(Collection<Address> address) {
        this.address = address;
    }


}

   @Entity(name="Address")
public class Address {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;
    @Column(name="country")
    private String country;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }

}

1 个答案:

答案 0 :(得分:0)

如果有很多关系,你总是要使用JOIN Table(这是第三个表)。在这种情况下,即使你使用CASCADE,你也不会在删除Owning实体时删除子实体的问题-ALL。

请参阅以下帖子:

Modeling many-to-many Relationship in JPA/Hibernate