我用户表与字典表是多对一的关系,保存时HrpBaseData的主键ID已经得到了,为什么还会添加一个HrpBaseData数据,再保存USER表保存呢?只定义了USER表的关系如下:
@ManyToOne(fetch=FetchType.EAGER,optional=true,cascade=CascadeType.ALL)
@JoinColumn(name = "I_NATIVEPLACE_ID",nullable=false)
    public HrpBaseData getNativePlace() {
        return nativePlace;
    }如果我设置成@ManyToOne(fetch=FetchType.LAZY,optional=true) 
保存时就会报org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.entity.HrpBaseData
请各位给我点意见, 谢谢。

解决方案 »

  1.   

    确实没怎么看懂。
    一般来说,设置了Cascade级联的情况下,User保存的时候,引用的HrpBaseData会被自动保存。
    如果没有设置级联,则需要在保存User之前先保存HrpBaseData对象。
      

  2.   

    谢谢各位的关注。
    另外一个对象是字典表数据,我从页面下拉框选择,把对象的主键ID保存到USER表中。
      

  3.   

    我写了一个,再我机器上测试没问题。 
    package eg;import java.io.Serializable;import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.EnumType;
    import javax.persistence.Enumerated;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.SequenceGenerator;
    import javax.persistence.Table;
    @Entity
    @Table(name="t_emp")
    @SequenceGenerator(name="employee_sequence", sequenceName="employee_sequence")
    public class Employee implements Serializable { private static final long serialVersionUID = 541409828401862527L; private Integer id;
    private String name;
    private Gender gender;
    private Department department;

    public Employee() {
    } @Id
    @GeneratedValue(generator="employee_sequence")
    @Column(name="_id", length=11)
    public Integer getId() {
    return id;
    } public void setId(Integer id) {
    this.id = id;
    } @Column(name="_name", length=30, nullable=false)
    public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } @Column(name="_sex", length=6)
    @Enumerated(EnumType.STRING)
    public Gender getGender() {
    return gender;
    } public void setGender(Gender gender) {
    this.gender = gender;
    } @ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.LAZY)
    @JoinColumn(
    name="_dep_id",
    nullable=true,
    referencedColumnName="_id"
    )
    public Department getDepartment() {
    return department;
    } public void setDepartment(Department department) {
    this.department = department;
    }
    }
    "java"
    package eg;import java.io.Serializable;import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;@Entity
    @Table(name="t_dep")
    @GenericGenerator(name="uuid", strategy="uuid")
    public class Department implements Serializable { private static final long serialVersionUID = 6795765460582026423L; private String uuid;
    private String name;
    private String location; public Department() {
    } public Department(String name, String location) {
    this.name = name;
    this.location = location;
    } @Id
    @GeneratedValue(generator="uuid")
    @Column(name="_id", length=32)
    public String getUuid() {
    return uuid;
    } public void setUuid(String uuid) {
    this.uuid = uuid;
    } @Column(name="_name", nullable=false, unique=true, length=30)
    public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } @Column(name="_location", nullable=true, length=50)
    public String getLocation() {
    return location;
    } public void setLocation(String location) {
    this.location = location;
    }
    }
    这个比较典型吧。 雇员类为Many,部门类为One。
    也是跟你一样的级联保存啊。一点问题也没有。
    你好好看看。
      

  4.   

    谢谢各位。 我的代码没有问题,出现的错误是说我的对象不是持久对象:org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.entity.HrpBaseData。
    我手动把页面传入的“籍贯编号”load一下再保存是可以成功的。
    我觉得这样做法不好,现在又没有好的办法,所以暂时采用手动load。期待有好的解决方式。
      

  5.   

    请问一下,我页面显示绑定实体类用“普通元素”怎么写?如:
    <select id="nativePlace" name="nativePlace.id"><option></option></select>
    nativePlace是User实体类的属性private HrpBaseData nativePlace;//藉贯
    我现在是这样写的,可以把值传入后台。 还有其他的方式吗?
      

  6.   

    1. fetch=FetchType.LAZY,cascade=CascadeType.ALL)
    @JoinColumn(name = "I_NATIVEPLACE_ID",nullable=false)
      public HrpBaseData2. 页面下拉框选择,把对象的主键ID保存到USER表首先,这个通过id得到的对像HrpBaseData是游离的(fetch=FetchType.LAZY,所以对像其实并未加载,只有个id),然后cascade=CascadeType.ALL级联保存的时候会将HrpBaseData也级联保存,所以要求HrpBaseData是已缓存的对像,所以会报错解决方法就是“手动把页面传入的“籍贯编号”load一下再保存是可以成功的。“ 通过id得到的HrpBaseData用load转换为已加载的状态