java Hibernate JPA与共享主键外键字段的一对一双向映射为空(hb无法自动设置)
所以我在最后一天尝试了一些单向的一对一映射,在一些测试之后,我决定尝试另一种方法。当我试图坚持我的实体时,偶然发现了一个问题。我找不到一种方法来强制hibernate同时用引用来填充我的外键字段。它只将它们设置为一种方式,而不是另一种方式:
Item ---> ItemInfo (I populate info field manually in constructor)
Item <-x- ItemInfo (hibernate doesn't set item field on persist)
所以当我试图持久化Item
实体时,我从@MapsId
:attempted to assign id from null one-to-one property [by.test.hm.ItemInfo.item]
得到异常
我的桌子:
t_item_info(item_id)
引用t_item(id)
字段。只有t_item(id)
列是自动递增的
我的班级:
@Entity
@Table(name = "t_item")
class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(mappedBy = "item", cascade = CascadeType.ALL,
fetch = FetchType.LAZY, orphanRemoval = true, optional = false)
private ItemInfo info;
private String name;
}
另一个:
@Entity
@Table(name = "t_item_info")
class ItemInfo {
@Id
private Long itemId;
@MapsId
@OneToOne
@JoinColumn(name = "item_id", referencedColumnName = "id")
private Item item;
private String descr;
}
如何创建和持久化对象:
Item item = new Item(
null,
new ItemInfo(null, "Somde description"),
"Some name"
);
itemRepo.save(item);
例外情况:
org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [by.test.hm.ItemInfo.item] at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:87) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:115) at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:113)
我试了很多东西。在切换端,我将mappedBy从Item
声明为ItemInfo
,在这种情况下,所有内容都停止工作,因为ItemInfo
尝试首先持久化。我尝试了所有可能的optional = false\true
和nullable = false\true
组合,但似乎没有任何效果=(
我知道我可以手动设置引用,异常将消失,我知道我可以使用@PostPersist
来设置它,但我正在寻找答案,当hibernate自动为我设置时
PS:我发布了关于单向映射的类似问题,我是这里的新手,所以我希望我在为类似问题创建新问题时没有做错什么
# 1 楼答案
主题外,但您的类具有相同的名称
请尝试上面的代码