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
的新实例时,应使用建议的方法。