我用户表与字典表是多对一的关系,保存时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
请各位给我点意见, 谢谢。
@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
请各位给我点意见, 谢谢。
一般来说,设置了Cascade级联的情况下,User保存的时候,引用的HrpBaseData会被自动保存。
如果没有设置级联,则需要在保存User之前先保存HrpBaseData对象。
另外一个对象是字典表数据,我从页面下拉框选择,把对象的主键ID保存到USER表中。
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。
也是跟你一样的级联保存啊。一点问题也没有。
你好好看看。
我手动把页面传入的“籍贯编号”load一下再保存是可以成功的。
我觉得这样做法不好,现在又没有好的办法,所以暂时采用手动load。期待有好的解决方式。
<select id="nativePlace" name="nativePlace.id"><option></option></select>
nativePlace是User实体类的属性private HrpBaseData nativePlace;//藉贯
我现在是这样写的,可以把值传入后台。 还有其他的方式吗?
@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转换为已加载的状态