我一直在使用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。
答案 0 :(得分:0)
经过一些调试并使用Luay Abdulreheem建议我发现hibernate工作得很好;在这种情况下,我的对象是使用REST接口发送的(使用Jackson),并且由于使用字段完成JSON的解组,因此对父进程的引用丢失了。
所以没什么可看的,继续......