"mappedBy"作为拥有关系的字段

3
我认为我对于在@OneToMany字段中使用属性mappedBy有所了解(即表示该字段的类型所代表的表具有一个外键指向声明了@OneToMany(mappedBy="...")的表),但我不完全理解它的语法(或最终的含义 -> 矛盾)。
根据文档:

mappedBy

public abstract String mappedBy

拥有关系的字段。

除非关系是单向的,否则必需。

默认值:""

文档中所提到的是哪个字段?mappedby的值应该匹配哪个表?

这里有一个解释 https://dev59.com/P2ox5IYBdhLWcg3wl1T4#9108618 - leeor
@leeor 正如我在问题中所说的,我认为我理解了属性目的的含义,但不是它的语法,mappedby可以采用哪些值?这些值需要与哪些属性以及哪些表或模型匹配吗? - nbro
啊,我明白了。属性需要与参与关系的注解类中的字段名匹配,而不是数据库表列名。 - leeor
@leeor 好的,但文档只提到了一个字段(不像你所说的那么多)。这个字段是指Java类中通常意义下的字段,还是什么?我看到周围通常mappedby的值只是使用mappedby的类的名称(但小写)...所以,在一些地方(至少在我看到的一些地方),人们并没有使用任何参与关系的表中的字段名称,而是似乎是最随意的名称... - nbro
1
不,"its"指的是类中参与关系的实例字段。现在我更好地理解了你的问题,我会在回答中详细说明。 - leeor
1个回答

3

请查看示例。该示例涉及到一个一对多关系,其中有两个类:StockStockDailyRecord。请注意,在类Stock中的@OneToMany stockDailyRecords字段:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "stock")
public Set<StockDailyRecord> getStockDailyRecords() {
    return this.stockDailyRecords;
}

因此,在这种情况下,它表示StockDailyRecord类中的stock字段(不要与Stock类混淆)拥有关系。我认为让人更加困惑的是,在这种情况下,字段和类的名称都相同。这种情况也非常普遍,因为按照惯例,你倾向于通过该字段类名的小写来引用另一侧关系的名称(例如,对于Stock,使用stock)。
因此,mappedBy属性实际上由StockDailyRecord类拥有。这意味着StockDailyRecord将处理在Stock类中引用的stockDailyRecords的持久化。 mappedBy属性值中引用的名称是类字段名称,而不是表列名称。
以下是该关系的StockDailyRecord端的外观:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "STOCK_ID", nullable = false)
public Stock getStock() {
    return this.stock;
}

希望这能帮到你,我知道这有些令人困惑 :)

谢谢!我现在明白了。我本来以为会有另一个问题或疑问。@JoinColumn中的name属性是否表示StockDailyRecord表中外键列的名称?另一个问题是:目前情况下,Stock没有任何列引用StockDailyRecord,对吗?最后一个问题是:如何向Stock添加一个外键,该外键还引用了StockDailyRecord?或者这是一个好主意吗?抱歉,我只是想很好地理解,但通常阅读会让你更加困惑。 - nbro
也因为人们似乎假定你知道一些重要的细节。 - nbro
关于你的第一个问题,是的 - 那是一个数据库列名。 - leeor
第二个问题:没错。数据库中的外键存在于“stock_daily_record”表中,因为这是您需要捕获关系的全部。 - leeor
你不需要在两侧都设置外键,因为 stock_daily_record 表中的外键已足以捕获关系。 - leeor
稍微更新了一下,试图让它更清晰。 - leeor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接