关于jpa的mappedBy用法

本文探讨了在使用JPA时遇到的mappedBy引用未知目标实体属性的错误,详细解析了SourceData与Alias类之间的映射关系,并提供了正确的配置示例,避免生成不必要的映射表。

 mappedBy reference an unknown target entity property

对于这种错误,因为映射关系处理错误

@Entity
@Table(name = "source_data")
public class SourceData implements Serializable {

    /**
     * 对应table的信息
     */
    @Column(nullable = false, length = 20)
    @Size(min = 2, max = 20)
    private String tableName;

    /**
     * 第5列的字段,为与s4导出的表的column对应
     */
    @Id
    @Column(nullable = false, length = 30)
    private String sourceName;

    /**
     * 对应第7行信息
     */
    @Column(nullable = false, length = 20)
    private String classification;

    /**
     * 对应数据的输入类型,方便格式转换
     */
    @Column(nullable = false, length = 20)
    private String dataType;

    /**
     * 针对SourceName的说明
     * 第8列的字段
     */
    @Column(nullable = false, length = 50)
    private String explanation;

    @OneToMany(mappedBy = "sourceData")
    private Set<Alias> aliases;
}

对于mappedBy的映射应该对应到Alias类中,可以看的Alias对应的类中有sourceData参数,

如果不加mappedBy,就会对生成一张映射表

@Entity
public class Alias implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
    @JoinColumn(name="source_name", nullable=false)
    private SourceData sourceData;

    @Column(nullable = false, length = 30)
    private String alias;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public SourceData getSourceData() {
        return sourceData;
    }

    public void setSourceData(SourceData sourceData) {
        this.sourceData = sourceData;
    }

    public String getAlias() {
        return alias;
    }

    public void setAlias(String alias) {
        this.alias = alias;
    }
}

 

### 三级标题:@OneToMany 中 mappedBy 的作用及使用示例 在 JPA 和 Hibernate 中,`@OneToMany` 注解用于定义一对多的关联关系。当需要建立双向关联时,`mappedBy` 属性起到了至关重要的作用。它用于指定由哪一方来维护关联关系,通常由多的一方(即“多”端)来负责维护关系,而“一”端则通过 `mappedBy` 属性声明自己不负责更新数据库中的外键字段[^2]。 #### mappedBy 的作用 `mappedBy` 属性的作用是告诉 JPA 该关联是由另一端的实体属性所管理的,即该关系的维护责任被交给了另一方。这样可以避免 JPA 自动生成额外的中间表来维护关系,并确保外键字段由正确的实体管理[^3]。 如果不使用 `mappedBy`,JPA 会默认该关系由当前实体管理,并可能生成一个额外的中间表来保存关联信息。这在一对多关系中通常是不必要的,因为“多”端已经可以通过外键直接关联到“一”端[^3]。 #### 使用示例 假设有一个 `Catalog` 实体和一个 `Directory` 实体,其中 `Catalog` 可以包含多个 `Directory`,并且 `Directory` 实体中维护了与 `Catalog` 的关联关系。 **Catalog 实体:** ```java @Entity public class Catalog { @Id private Long id; @OneToMany(mappedBy = "catalog") private List<Directory> directories = new ArrayList<>(); // 其他字段和方法... } ``` **Directory 实体:** ```java @Entity public class Directory { @Id private Long id; @ManyToOne @JoinColumn(name = "catalog_id", nullable = false) private Catalog catalog; // 其他字段和方法... } ``` 在上述代码中,`Catalog` 实体中的 `directories` 字段通过 `mappedBy = "catalog"` 声明该关系由 `Directory` 实体中的 `catalog` 字段维护。因此,JPA 不会为 `Catalog` 的 `directories` 字段生成额外的中间表,而是直接使用 `Directory` 表中的 `catalog_id` 外键列来管理关联关系[^3]。 #### 注意事项 - `mappedBy` 的值必须是“多”端实体中用于关联“一”端的属性名。 - 如果“多”端没有定义对应的关联属性,或者没有使用 `@JoinColumn` 明确指定外键列,可能会导致 `mappedBy reference an unknown target entity property` 的错误[^1]。 - 在双向关联中,建议总是使用 `mappedBy` 来避免生成不必要的中间表,并提高数据一致性和查询性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值