Java 仅使用ID写入多对多联接表

Java 仅使用ID写入多对多联接表,java,jpa,Java,Jpa,在@ManyToOne关系中,可以通过设置相关表的id来处理关系的写入: @Entity public class Foo{ @GeneratedValue @Id private Long id; @Column(name = "bar_id") private Long barId; @ManyToOne @JoinColumn(insertable = false, updatable = false) private Bar

@ManyToOne
关系中,可以通过设置相关表的id来处理关系的写入:

@Entity
public class Foo{
    @GeneratedValue
    @Id
    private Long id;
    @Column(name = "bar_id")
    private Long barId;
    @ManyToOne
    @JoinColumn(insertable = false, updatable = false)
    private Bar bar;
    // ...
}

@Entity
public class Bar{
    @GeneratedValue
    @Id
    private Long id;
    @OneToMany(mappedBy = "bar")
    private List<Foo> foos;
    // ...
}
@实体
公开课Foo{
@生成值
@身份证
私人长id;
@列(name=“bar\u id”)
私人长巴里德;
@许多酮
@JoinColumn(可插入=false,可更新=false)
私人酒吧;
// ...
}
@实体
公共类酒吧{
@生成值
@身份证
私人长id;
@OneToMany(mappedBy=“bar”)
私人名单;
// ...
}

在许多情况下(例如:在构建
Bar
实例时比较困难),这是一种更好的方法,可以持久化与
Bar
相关的
Foo
,而不是将
Foo.Bar
设置为空实例并设置该实例的
id
。如何在
@manytomy
关系中实现类似的功能?

@manytomone
示例类似,您只能通过设置
barIds
字段和
bar
字段为只读来保持关系:

@Entity
public class Foo {
    @GeneratedValue
    @Id
    private Long id;
    @ElementCollection
    @CollectionTable(name = "foo_bars", joinColumns = @JoinColumn(name = "foos_id", referencedColumnName = "id"))
    @Column(name = "bars_id")
    private Set<Long> barIds;
    @ManyToMany
    @JoinColumn(insertable = false, updatable = false)
    private Set<Bar> bars;
    // ...
}
@实体
公开课Foo{
@生成值
@身份证
私人长id;
@元素集合
@CollectionTable(name=“foo\u bar”,joinColumns=@JoinColumn(name=“foos\u id”,referencedColumnName=“id”))
@列(name=“bar\u id”)
私人酒吧;
@许多
@JoinColumn(可插入=false,可更新=false)
私人酒吧;
// ...
}

使用上述方法和“将
foo.bar
设置为空实例并设置该实例的
id
”对我来说都是糟糕的想法。如果要建立与实体的关联,而不获取该实体,请使用
EntityManager.getReference(entityClass,id)
@crizzis当您要使用该关系持久化
Foo
的新实例时,应使用建议的方法。