Java Hibernate:@OrderColumn,通过添加和删除重新插入
我应该如何通过重新排序(添加和删除)列表并使用Hibernate@OneToMany和@OrderColumn将其保存回数据库来更新 文档中没有提到这个问题,我发现的唯一解决方案在我看来是站不住脚的 下面是一个DB片段: 以下是我的实体:Java Hibernate:@OrderColumn,通过添加和删除重新插入,java,hibernate,Java,Hibernate,我应该如何通过重新排序(添加和删除)列表并使用Hibernate@OneToMany和@OrderColumn将其保存回数据库来更新 文档中没有提到这个问题,我发现的唯一解决方案在我看来是站不住脚的 下面是一个DB片段: 以下是我的实体: @Entity @Table(name="channel") public class Channel { @Id @GeneratedValue(strategy= GenerationType.AUTO, generator="native
@Entity
@Table(name="channel")
public class Channel {
@Id
@GeneratedValue(strategy= GenerationType.AUTO, generator="native")
@GenericGenerator(name = "native", strategy = "native")
@Column(name="channel_id")
private Long channelId;
@Column(name="name")
private String name;
@OneToMany(mappedBy = "channel", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@OrderColumn(name = "sequence_order")
private List<Programme> programmes = new ArrayList<>();
public void addProgramme(Programme programme) {
programmes.add(programme);
programme.setChannel(this);
}
}
@Entity
@Table(name="programme")
public class Programme {
@Id
@GeneratedValue(strategy= GenerationType.AUTO, generator="native")
@GenericGenerator(name = "native", strategy = "native")
@Column(name="prog_id")
private Long progId;
@Column(name="name")
private String name;
@Column(name="type")
private String type;
@Column(name="sequence_order")
private int order;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="channel_id")
private Channel channel;
}
接下来是重新排序、插入和删除的更新:
// Working solution
@Commit
@Test
public void updateTest() {
Channel channel = channelDao.findById(1L).get();
channel.getProgrammes().clear();
channelDao.flush();
Programme programme2 = new Programme();
programme2.setName("France News");
programme2.setChannel(channel);
programme2.setType("news");
Programme programme3 = new Programme();
programme3.setName("Holidays in Paris");
programme3.setChannel(channel);
programme3.setType("movie");
Programme programme4 = new Programme();
programme4.setName("FIFA Cup 2018");
programme4.setChannel(channel);
programme4.setType("sport");
Programme programme5 = new Programme();
programme5.setName("Music show");
programme5.setChannel(channel);
programme5.setType("show");
channel.addProgramme(programme5);
channel.addProgramme(programme4);
channel.addProgramme(programme3);
channel.addProgramme(programme2);
}
因此,这里基本上是清空原始列表,然后按照需要的顺序将更新后剩下的内容重新插入数据库。以其他方式进行此更新的许多其他尝试都失败了
问题是,我能用一种聪明的方式来做吗?比如说,只删除已删除的内容,更新已更新的顺序,只插入新的内容?
当然,我可以按索引删除,并在列表末尾插入,但在对整个列表重新排序时,这些基本操作是不够的
有可能吗
谢谢大家! 在hibernate中,列表维护插入顺序,我的意思是在progId中。您可以将@OrderBy注释与order字段一起使用。因此,当获取通道时,它将获取程序并按顺序排序
@OneToMany(mappedBy = "channel", cascade = CascadeType.ALL, fetch =
FetchType.EAGER, orphanRemoval = true)
@OrderBy("order ASC")
private List<Programme> programmes = new ArrayList<>();
@OneToMany(mappedBy=“channel”,cascade=CascadeType.ALL,fetch=
FetchType.EAGER,删除=true)
@订购人(“订购ASC”)
私有列表程序=新的ArrayList();
No,在我的例子中progId不是排序列,我的意思是当progId{4,18,12,6,2,9}同时按顺序{0,1,2,3,4,5}时,它可能是一个有效的例子。问题不是抓取,而是用重新排序的元素更新整个列表,再加上删除和插入。
@OneToMany(mappedBy = "channel", cascade = CascadeType.ALL, fetch =
FetchType.EAGER, orphanRemoval = true)
@OrderBy("order ASC")
private List<Programme> programmes = new ArrayList<>();