Hibernate / JPA使用生成的UUID持久化OneToMany对象

时间:2018-01-04 11:01:39

标签: java hibernate jpa uuid

我一直在使用Hibernate,但是使用带有UUID的Hibernate / JPA让我感到难过。我正在使用hibernate 5.2.12.Final。

我有一个名为TimePeriod的对象,带有这个映射:

@Entity(name = "time_period")    
public class TimePeriod extends AbstractDomainObject {

   @OneToMany(mappedBy = "timePeriod", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
   private List<TimePeriodBlock> timePeriodBlocks = new ArrayList<>();
   ...
   public void addTimePeriodBlock(TimePeriodBlock timePeriodBlock) {
      timePeriodBlock.setTimePeriod(this);
      this.timePeriodBlocks.add(timePeriodBlock);
   }
   ...

具有以下子关系:

@Entity(name = "time_period_block")
public class TimePeriodBlock extends AbstractDomainObject {
   ...   
   @ManyToOne
   @JoinColumn(name = "time_period_id", nullable = false)
   private TimePeriod timePeriod;
   ...

他们分享这个超级班:

@MappedSuperclass
public abstract class AbstractDomainObject {
   ...
   @Id
   @GeneratedValue
   @Column(name = "id", columnDefinition = "uuid", updatable = false)
   private UUID id;
   ...

执行以下操作时:

// pseudo code
TimePeriod t = new TimePeriod();
t.setName("test");
TimePeriodBlock b = new TimePeriodBlock();
t.addTimePeriodBlock(b);

em.persist(t);

我得到例外:

...
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value : test.TimePeriodBlock.timePeriod
...

一些注意事项:

我坚信这可能是因为Hibernate会生成UUID(而不是数据库)但是,由于我不确定,我希望其他开发人员可能知道这是如何工作的。

我正在使用PostgreSQL 9.6,数据库也可以生成UUIDv4但需要编译额外的扩展,所以我选择Hibernate来生成它。

当我在数据库中输入一些数据并检索数据时,它会被提取而没有任何错误。

存储没有@ManyToOne关系的其他对象会存储没有任何错误,并且具有由Hibernate生成的UUID。

1 个答案:

答案 0 :(得分:0)

经过一些调试并使用Luay Abdulreheem建议我发现hibernate工作得很好;在这种情况下,我的对象是使用REST接口发送的(使用Jackson),并且由于使用字段完成JSON的解组,因此对父进程的引用丢失了。

所以没什么可看的,继续......