嘿。
我认为我在 Spring Data、JPA 等方面遇到了一些奇怪的行为。我编写了一个 Flyway 迁移脚本,将新数据插入表 cash_entry_note。
与实体 AbstractCashEntry
相关的方式如下:
@Entity
@Table(name = AbstractCashEntry.TABLE_NAME)
@Inheritance(strategy = InheritanceType.JOINED)
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(of = "key", callSuper = false)
@NoArgsConstructor
abstract public class AbstractCashEntry extends TenantBaseModel {
@OneToMany(mappedBy = "cashEntry", cascade = { CascadeType.ALL })
protected Set<CashEntryNote> notes = new HashSet<>();
这是 CashEntry
的父类(super class)
@Entity
@Table(name = "cash_entry")
@Data
@ToString(callSuper = true, exclude = "group")
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
public class CashEntry extends AbstractCashEntry {
最后是类 CashEntryNote
本身
@Entity
@Table(name = "cash_entry_note")
@Data
@ToString(callSuper = true, exclude = "cashEntry")
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class CashEntryNote extends BaseModel {
@ManyToOne(optional = false)
private AbstractCashEntry cashEntry;
@ManyToOne(optional = false)
private Note note;
@ManyToOne(optional = false)
@DiffIgnore
private User reporter;
public LocalDateTime getDate() {
return createdAt;
}
}
现在我所做的是一些简单的 SQL 插入:
INSERT INTO [cash_entry_note] (created_at, modified_at, cash_entry, note, reporter) VALUES (GETDATE(), GETDATE(), @cash_key, @initial_note, 'username')
之后,我希望 JpaRepository 返回带有我最近插入的新注释的 CashEntry
实体。然而,这种情况并非如此。 CashEntry
的属性 notes
始终是一个空集,或者包含在 SQL 插入之前已经存在的注释。即使尝试使用 FetchType.EAGER 或重新启动服务器,存储库也不会返回新插入的 sql 注释。我缺少什么?有人有想法吗?
我还应该提到,这个项目正在使用 [Javers][1] http://javers.org/documentation/跟踪实体中的更改并稍后在审核日志中提供它们。
最佳答案
明白了。 @cash_key
变量以某种方式包含空格或制表符或任何不可见的控制字符 - 但这并没有阻止它在插入之前的 where 子句中进行比较,因此确实很难查明。
SELECT @cash_key = min(cash_key) FROM cash_entry
是罪魁祸首
关于java - Spring Data + JPA > SQL INSERT 后未从数据库中获取 "mappedBy"属性的新条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41812824/