jpa - @OrderColumn 未能按插入顺序对数组列表进行排序
问题描述
需要 ArrayList 按保存到数据库的顺序保存对象。使用 @OrderColumn 来实现这一点,但由于某种原因,它无法按从头到尾排序。
以下测试保存 2 个对象并尝试按降序检索对象(见最后一行),但失败了。
Watching.class
@ManyToMany(cascade = CascadeType.ALL,
targetEntity = Ticker.class,
fetch = FetchType.LAZY)
@JoinTable(name="watching_ticker",
joinColumns = @JoinColumn(name="watching_id"),
inverseJoinColumns= @JoinColumn(name="ticker_id"))
@OrderBy("id desc")
private List<Ticker> tickers;
...
Ticker.class
@JsonIgnore
@ManyToMany
@JoinTable(name ="watching_ticker",
joinColumns = @JoinColumn(name ="ticker_id"),
inverseJoinColumns = @JoinColumn(name = "watching_id"))
protected Set<Watching> watchings;
..
Tester
Account account;
AccountService accountService;
Ticker ticker;
Ticker tickerTwo;
@Before
public void setUp() throws Exception {
account = ...
ticker = ...;
tickerTwo = ...;
....
}
@Test
public void testSave() {
Watching watching = account.getWatching();
watching.getTickers().add(ticker);
watching.getTickers().add(tickerTwo);
Watching saved = accountService.save(account).getWatching();
Ticker one = saved.getTickers().get(0);
int size = saved.getTickers().size();
assertEquals(2, size);
Assert.assertEquals(one, tickerTwo); <-- fails
}
解决方案
请改用@OrderBy。@OrderColumn 按 ID 以外的不可见列对记录进行排序。
order 列作为实体或可嵌入类的状态的一部分不可见。
OrderBy 注释应该用于作为持久状态可见并由应用程序维护的排序。
https://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html
推荐阅读
- javascript - 用另一种方式而不是按钮提交 Rails 表单
- android - 如何使 com.google.android.material.button.MaterialButton 文本小写
- java - Base64 编码 .rtf 和 .pdf 类型文件 - Java/Groovy
- c# - ASP .NET Core 2.1 React 模板不能与控制器对话?
- r - Webscraping R 脚本不能从 crontab 运行
- python - 无法调试列表索引超出范围错误
- laravel-5 - 在 laravel 中添加自定义 css/js 文件
- vb.net - 在文本字段上添加签名 - itextsharp
- vba - MS Access VBA 跳过插入表之一
- sql-server - 如何在 sql server 中引用已声明的 INTEGER