Hibernate不保存复合键的自定义序列(当其中一个键值已知时)

时间:2016-06-14 06:11:14

标签: java hibernate transient

我的id和versionid的持久化类ProductVersionElement中有一个复合键。对于每个键,我有一个自定义的hibernate音序器作为IdGenerator和VersionIdGenerator。

@Id
    @GenericGenerator(name = "custom_id", strategy = "com.model.persistent.sequencer.IdGenerator")
    @GeneratedValue(generator = "custom_id")
    protected String id;

    @Id
    @GenericGenerator(name = "custom_versionId", strategy = "com.model.persistent.sequencer.VersionIDGenerator")
    @GeneratedValue(generator = "custom_versionId")
    protected String versionId;

案例1.当id和versionid都为null时。然后,sequencer将填充两个字段的序列,并成功保存ProductVersionElement。保存后,在调试中显示两个字段的生成值。

情况2:设置id时(我事先知道该值并且只想生成versionid)并且versionid为null。为此,我更改了序列器,使得:如果field的值为null,则生成序列else返回相同的值。

if (id == null) {
   //Generate the sequence and return
} else{
  // return same id
}

在这种情况下,它不保存ProductVersionElement。即使在保存之后,它只显示id的值(已经设置),并且在保存后versionid仍为null。

虽然它不会导致任何异常,但在此之后我尝试保存另一个Object:ProductCharacteristics包含ProductVersionElement(以保存其中一个id)时,会导致以下错误:

org.springframework.dao.InvalidDataAccessApiUsageException:org.hibernate.TransientPropertyValueException:object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.orange.obsit.sando.cibinternational.model.persistent.ProductCharacteristic.productVersionElement - &gt ; com.orange.obsit.sando.cibinternational.model.persistent.ProductVersionElement;

你能就此提出任何建议吗?

0 个答案:

没有答案