Java JPA双向ManyToOne映射不起作用

Posted

技术标签:

【中文标题】Java JPA双向ManyToOne映射不起作用【英文标题】:Java JPA bidirectional ManyToOne mapping not working 【发布时间】:2020-03-12 03:48:05 【问题描述】:

我正在尝试在现有表和新表之间设置新的 JPA 双向映射。它似乎不起作用。实体管理器在运行时不会初始化。

其他现有表似乎没有问题。此外,如果我从持久性 xml 中删除此新表及其关联对象,则应用程序启动正常。

应用程序也可以正常工作,当新表自己添加时,没有外键连接即。 OneToMany 或 ManyToOne 映射。

有人可以帮我找出缺少的东西吗?

异常注明:

ERROR SomeService:104 - General Error: Something wrong happened in JVM
java.lang.NoClassDefFoundError: Could not initialize class com.java.path.persistence.DefaultEntityManager

CREATE TABLE IF NOT EXISTS new_entity (
    id                      BIGSERIAL PRIMARY KEY,
    existing_tbl_id         BIGINT NOT NULL
);

现有实体:

CREATE TABLE IF NOT EXISTS existing_entity (
    id                      BIGSERIAL PRIMARY KEY
);

ExistingEntity.java

@Entity
@Table(name = "existing_entity")
public class ExistingEntity 
   @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private Long id;

    public Long getId() 
        return id;
    
    public void setId(Long id) 
        this.id = id;
    

    @OneToMany(mappedBy = "existingEntity", 
            cascade = CascadeType.ALL, 
            fetch = FetchType.EAGER)
    private List<NewEntity> newEntities = new ArrayList<>();


    public List<NewEntity> getNewEntities() 
        return newEntities;
    

    public void setNewEntities(List<NewEntity> newEntities) 
        newEntities.forEach(newEntity -> 
        newEntity.setExistingEntity(this)
        );
        this.newEntities = newEntities;
    

    public void addNewEntities(NewEntity newEntity) 
        if (newEntity != null) 
            newEntity.setExistingEntity(this);
            newEntities.add(newEntity);
        
    

NewEntity.java

@Entity
@Table(name = "new_entity")
public class NewEntity 
   @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private Long id;

    public Long getId() 
        return id;
    
    public void setId(Long id) 
        this.id = id;
    

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "existing_tbl_id")
    private ExistingEntity existingEntity;

    public ExistingEntity getExistingEntity() 
        return existingEntity;
    

    public void setExistingEntity(ExistingEntity existingEntity) 
        this.existingEntity = existingEntity;
    


我也尝试了以下方法,但它不起作用:

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "existing_tbl_id", referencedColumnName = "id")
    private ExistingEntity existingEntity;

【问题讨论】:

这能回答你的问题吗? Configure JPA to let PostgreSQL generate the primary key value K.Nicholas,不,没有。 您的新表具有BIGSERIAL 列类型。我认为这需要特殊处理。此外,您的问题完全缺乏帮助您所需的任何细节。 BIGSERIAL 在所有地方都运行良好。如果我添加了表格但没有加入 FK 列,则该应用程序将启动。我为更少的信息道歉。您能否指导我如何更好地添加细节? 请添加existing_entitynew_entity 的架构以及应用程序失败时收到的错误消息。您提供的架构名为new_table,但您的两个类都没有引用new_table 名称。您还应该从您的实体创建一个 DDL,并将其与您的架构进行比较,以了解有什么区别。 【参考方案1】:

解决方案: 将 Fetch 类型切换为 Lazy 如下:

    @OneToMany(mappedBy = "existingEntity", 
    cascade = CascadeType.ALL, 
    fetch = FetchType.LAZY)
    private List<NewEntity> newEntities = new ArrayList<>();


我不确定 fetch 样式是如何导致这种差异的。

【讨论】:

以上是关于Java JPA双向ManyToOne映射不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Java - Spring Boot - Hibernate - JPA(@ManyToOne 发布错误)

JPA(Hibernate)上的多个双向映射问题

双向 JPA OneToMany/ManyToOne 关联中的“关联的反面”是啥?

如何响应 Spring RestController 返回 ManyToOne 双向 JPA 实体对象?

使用 OnetoMany 和 ManytoOne 映射时的无限递归循环(双向)

层次结构中 JPA 实体之间的双向关系