情况是:我有一个Pojo DEVICE,里面有一个pojo Namespace pojo。 :
@Entity
@Table(name = "device")
public class Device implements java.io.Serializable {
private long deviceId;
private long timestamp;
private NamespaceMaster namespaceMaster;
..................
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "namespace_id")
@Cascade(value = CascadeType.ALL)
public NamespaceMaster getNamespaceMaster() {
return this.namespaceMaster;
}
当我持久化Device时,我正在查询数据库以找到适当的命名空间,然后将命名空间pojo设置为device。到目前为止,没有任何一个。
NamespaceMaster namespaceMaster=null;
try {
namespaceMaster = namespaceDAOImpl.queryAllByName(namespace, AZURE_CLOUDTYPE).get(0);
} catch (DaoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LOG.info("Namespace object from cache :{}",namespaceMaster);
device.setNamespaceMaster(namespaceMaster);
现在,当我尝试持久化设备时,DB中的命名空间表也插入了新行,其值与我最初查询命名空间表的值相同。这是由于
发生的@Cascade(value = CascadeType.ALL)
原因是:Hibernate无法将名称空间对象识别为已经存在的名称空间对象。所以它将所有pojo内部级联,而hense插入一个新的。
我的问题很简单。如何在表中插入设备对象,以便不生成新的命名空间。它是命名空间表中已存在的那个。我尝试删除@Cascade(value = CascadeType.ALL),但后来我收到错误:
object references an unsaved transient instance - save the transient instance before flushing
注意
我在NamespaceMaster表中添加了@version
@Version
private Long version;
private static final long serialVersionUID = 1L;
我很震惊!请建议。 提前谢谢。
答案 0 :(得分:0)
解决了上述问题。
我为我的数据插入了namespace_id(名称空间表的主键)为0。可能是hibernate无法理解0作为关键并在这种情况下解决。伙计们要注意这个事实!!
我尝试为hashcode(),equals; @Version等实现,但没有任何效果。将我的表主键从0更新为更高的值!!
反正!!