Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:@OrderColumn,通过添加和删除重新插入_Java_Hibernate - Fatal编程技术网

Java Hibernate:@OrderColumn,通过添加和删除重新插入

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

我应该如何通过重新排序(添加和删除)列表并使用Hibernate@OneToMany和@OrderColumn将其保存回数据库来更新

文档中没有提到这个问题,我发现的唯一解决方案在我看来是站不住脚的

下面是一个DB片段:

以下是我的实体:

@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<>();