gpt4 book ai didi

java - Spring 和 JPA 2.0 - 具有额外列的多对多关系中的复合键

转载 作者:行者123 更新时间:2023-12-01 21:54:39 26 4
gpt4 key购买 nike

我有两个多对多关系的实体 Foo 和 Bar。连接实体是 FooBar,并且由于该实体有另一个属性(它自己的 id),因此我在所有者端使用了 @ManyToOne (FooBar ) 和依赖实体(FooBar)中的 @OneToMany。如何创建一个扩展 CrudRepositoryFooBarRepository,而 FooBar 内没有显式复合键字段?理想情况下,我不想更改 FooBar 类的成员。

我尝试使用@IdClass,但我不想在FooBar中包含字段fooIdbarId code> 我收到此异常:

由以下原因引起:org.hibernate.AnnotationException:在实体 com.nano.testers.test.FooBar 中找不到 @IdClass 的属性:barId

我还尝试遵循 IdClass 的文档并明确按名称引用列,但我失败了(也许解决方案就在这里?)

The names of the fields or properties in the primary key class and the primary key fields or properties of the entity must correspond and their types must be the same.

我尝试将 FooBar 中的字段名称更改为 id,以便将它们引用为 foo_idbar_id 在连接表中,但异常是相同的。

我不想使用 @EmbeddedId,如果这意味着我需要在 FooBar 类中拥有一个 FooBarPk 类型的字段.

@Entity
public class Foo {
@Id
private Long fooId;

@OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
private Set<FooBar> foobars;
}
@Entity
public class Bar {
@Id
private Long barId;

@OneToMany(mappedBy = "bar", cascade = CascadeType.ALL)
private Set<FooBar> foobars;
}
@Entity
//@IdClass(FooBarPk.class)
public class FooBar implements Serializable {
@Id
private Long fooBarId;

@Id
@ManyToOne
@JoinColumn
private Foo foo;

@Id
@ManyToOne
@JoinColumn
private Bar bar;

}
public class FooBarPk implements Serializable {
private Long fooId;
private Long barId;
private Long fooBarId;
}
public interface FooBarRepository extends CrudRepository<FooBar, FooBarPk> {
}

最佳答案

看起来复合键类中的字段名称必须与引用实体的名称相同。我认为这些名称不遵循干净代码原则,但我现在必须接受这个解决方案。

public class FooBarPk implements Serializable {
private Long foo;
private Long bar;
private Long fooBarId;
}

关于java - Spring 和 JPA 2.0 - 具有额外列的多对多关系中的复合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58747868/

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