有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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实体时,我从@MapsIdattempted to assign id from null one-to-one property [by.test.hm.ItemInfo.item]得到异常

我的桌子:

enter image description here

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)

我试了很多东西。在切换端,我将mappedByItem声明为ItemInfo,在这种情况下,所有内容都停止工作,因为ItemInfo尝试首先持久化。我尝试了所有可能的optional = false\truenullable = false\true组合,但似乎没有任何效果=(

我知道我可以手动设置引用,异常将消失,我知道我可以使用@PostPersist来设置它,但我正在寻找答案,当hibernate自动为我设置时

PS:我发布了关于单向映射的类似问题,我是这里的新手,所以我希望我在为类似问题创建新问题时没有做错什么


共 (1) 个答案

  1. # 1 楼答案

    @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;
         
         @Column(name="name)
         private String name;
                
         // Getters and setters omitted for brevity 
               
         private void setItemInfo(ItemInfo info) {
            if (info == null) {
               if (this.info != null) {
                  this.info.setInfo(null);
               }
            } else {
                 info.setInfo(this);
            }
         this.info = info;  
    }
    
    @Entity
    @Table(name = "t_item_info")
    class ItemInfo {
    
        @Id
        private Long itemId;
    
        @OneToOne
        @MapsId
        @JoinColumn(name="item_id)
        private Item item;
    
        @Column(name="description")
        private String description;
    
        // Getters and setters omitted for brevity
    
    }
    

    主题外,但您的类具有相同的名称

    请尝试上面的代码