我有以下与一对一映射相关联的类。
@Entity
public class EmployeeEntity
{
@Id
private String id;
private String name;
@OneToOne(mappedBy = "employeeEntity", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@Fetch(FetchMode.SELECT)
@JoinColumn(name = "empid")
private AddressEntity addressEntity;
...
...
getters & setters
}
@Entity
public class AddressEntity
{
@Id
@Column(unique=true, nullable=false)
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="employeeEntity"))
private String empId;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private EmployeeEntity employeeEntity;
...
getters & setters
}
我正在使用postgres,并且表(employeeentity,addressentity)对addressentity表具有以下foregen键约束:
外键约束:
“fkakhilesh”外键(empid)引用DELETE CASCADE上的employeeentity(id)
我对不同的休息电话有以下要求:
休息后呼叫-应创建具有地址的员工。
休息后呼叫-应创建没有地址的员工。
得到休息电话-应该找回一个雇员。如果存在,地址也应该出现。
放置休息呼叫-应该更新雇员和地址(如果地址存在)。
放置REST调用-应该更新一个雇员和地址(当地址被传递时,它已经存在于EMPID实体的地址实体表中)
放置REST调用-应该更新一个雇员并创建地址(当地址被传递时,它不存在于EMPID的地址实体表中)
我可以执行操作1到5没有任何问题。
主要问题在6个方面,我想到了以下几个问题:
一。当我执行“getSession().update(object)”时,得到hibernate的StaleStateException:Batch update从更新[0]返回了意外的行计数;实际行计数:0;应为:1。
如果地址不存在,这是不是可能的“更新”?不能在更新期间创建新地址吗?
我需要将serviceinpl调用更改为“getSession().merge(object)”吗?这种情况只能通过调用“merge”来处理吗?它如何影响性能?
如果我合并,我会得到hibernate的IdentifierGenerationException:试图从空的一对一属性分配id。
我是不是丢了什么东西?
这可以通过改变hibernate映射来解决?或与瀑布有关的东西。
这里@GeneratedValue(generator=“gen”)的重要性是什么?为什么@GenericGenerator中使用@parameter
我对hibernate还不太熟悉,我想深入了解hibernate映射。
另外,我很高兴你能建议我的设计应该是最好的方式来处理这个问题。
最佳答案
我找到了解决办法。这个映射有点复杂,不像我最初想象的那么简单。
我使用了双向的一对一映射,因此在更新期间调用EmployeeEntity和AddressEntity的setter相互设置是很重要的。例如:
必须显式调用employeeEntity.setAddressEntity(addressEntity)和addressEntity.setEmpoyeeEntity(empoyeeEntity)。
单独设置employeeEntity.setAddressEntity(addressEntity)将不起作用。