我有一对一映射的关联类。休眠一对一映射不更新子表
@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", [email protected](name="property", value="employeeEntity"))
private String empId;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private EmployeeEntity employeeEntity;
...
getters & setters
}
我使用Postgres的和具有下面就addressentity表foriegn键约束表(employeeentity,addressentity): 外键约束: “fkakhilesh” 外键(EMPID)参考employeeentity(ID)ON DELETE CASCADE
我有以下要求用不同的REST调用:
- POST REST调用 - 应该创建一个员工提供地址。
- POST其余呼叫 - 应创建一个没有地址的员工。
- GET Rest call - 应该检索employeee。地址也应该来,如果它存在。
- PUT其余呼叫 - 应更新员工和地址(如果地址存在)。
- 把REST调用 - 应该更新雇员和地址(在地址传递,它已经在EMPID addressentity表存在)
- 把REST调用 - 应该更新的员工,并创建地址(如果地址是过去了,在empid的地址表中不存在)
我能够在没有任何问题的情况下执行操作1到5。
主要问题出现在我的脑海里,并且出现以下问题: 1.当我做“getSession()。update(object)”时,我得到hibernate的StaleStateException:批量更新返回来自update [0 ]。实际行数:0;预期:1. 如果地址不存在,这是不可能的“更新”?我无法在更新期间创建新地址吗?
我需要改变我的ServiceImpl呼叫合并‘?它如何影响性能“的getSession()。合并(对象)?在这种情况下,只能通过调用来处理’?
如果我做的合并,我得到Hibernate的IdentifierGenerationException:试图从空一到一个属性 我在这里失去了一些东西给ID
,这可以通过改变Hibernate映射解决或事端有关级联
。?。@GeneratedValue(generator =“gen”)在这里的重要性是什么?为什么在@GenericGenerator
是@parameter用我新的休眠和试图进入Hibernate映射的深度。 另外,如果你能在设计上建议我应该是最好的处理方法,我会很高兴。
不要紧,如果你使用整数ID或字符串ID。 – akhi 2013-02-28 05:45:55