在hibernate中保持复合pojo,但内部pojo变得新鲜持久

时间:2016-12-23 16:18:18

标签: spring hibernate

情况是:我有一个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;

我很震惊!请建议。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

解决了上述问题。

我为我的数据插入了namespace_id(名称空间表的主键)为0。可能是hibernate无法理解0作为关键并在这种情况下解决。伙计们要注意这个事实!!

我尝试为hashcode(),equals; @Version等实现,但没有任何效果。将我的表主键从0更新为更高的值!!

反正!!