gpt4 book ai didi

java - 在单独的表中映射 @Embeddable

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:11:45 26 4
gpt4 key购买 nike

两个表如:

CREATE TABLE foo (
id INT PRIMARY KEY,
x TEXT
);

CREATE TABLE bar (
foo_id INT REFERENCES foo (id) ON DELETE CASCADE,
y TEXT,
z TEXT
);

...可以这样映射:

@Table(name = "foo")
@SecondaryTable(name = "bar", pkJoinColumns = @PrimaryKeyJoinColumn(name = "foo_id", referencedColumnName = "id"))
class Foo {

@Id
int id;

@Embedded
@AttributeOverrides({
@AttributeOverride(name = "y", column = @Column(table = "bar")),
@AttributeOverride(name = "z", column = @Column(table = "bar"))
})
Bar bar;
}

@Embeddable
class Bar {
String y;
String z;
}

有没有更简单的方法来完成这个映射,要么只使用标准 JPA 注释,要么使用特定于 Hibernate 的注释(并且不在可嵌入对象中引入父引用)?

将此与使用 @ElementCollection@CollectionTable 引用一组 @Embeddable 对象的轻松程度进行比较。

最佳答案

抱歉回答晚了,但我对这个问题很感兴趣,所以我想我会尝试一下。

一个更优雅的解决方案是使bar 的内容成为Entity 而不是Embeddable,并使用OneToOne 关系而不是Embedded。您还需要记住使用 @PrimaryKeyJoinColumn 而不是 @JoinColumn:

@Entity
@Table(name = "bar")
class Bar {
@Id
int fooId;

String y;
String z;
}

...

@Entity
@Table(name = "foo")
class Foo {
@Id
int id;

@OneToOne
@PrimaryKeyJoinColumn
Bar bar;
}

最大的好处是Foo不再需要知道Bar的内容。根据数据库的命名策略,您可能还需要在 Bar 中指定 fooId 的列名称,例如 @Column(name = "foo_id").

关于java - 在单独的表中映射 @Embeddable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43599840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com