我有以下与一对一映射相关联的类。

@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)将不起作用。

07-26 02:04