这是我的表结构。我正在使用
spring-boot-starter-data-jdbc
3.0.3。我将这些表映射如下。
@Table("ticket")
public class Ticket {
@Id
private int id;
private String subject;
private TicketType ticketType;
// getters and setters
}
@Table("ticket_type")
public class TicketType {
@Id
private int id;
private String name;
// getters and setters
}
当我尝试检索票证时,spring 抛出 BadSqlGrammarException。生成的查询是
SELECT `ticket`.`id` AS `id`, `ticket`.`subject` AS `subject`, `ticketType`.`id` AS `tickettype_id`, `ticketType`.`name` AS `tickettype_name` FROM `ticket` LEFT OUTER JOIN `ticket_type` `ticketType` ON `ticketType`.`ticket` = `ticket`.`id`
为什么 spring data JDBC 生成 on cause as
`ticketType`.`ticket` = `ticket`.`id`
代替
`ticketType`.`id` = `ticket`.`ticket_type`
我尝试将 @MappedCollection(idColumn = "ticket_id") 添加到 Ticket 类中的 ticketType 字段。那么生成查询的原因是
ticketType
.ticket_id
= ticket
.id
。我做错了什么?
您可以尝试使用 ManyToOne 和 joinColumn 注释来映射实体,同时仍然保留 FK 列字段。
@Table("ticket")
public class Ticket {
@Id
private int id;
private String subject;
@Column(name = "ticket_type")
private int ticketType;
@ManyToOne
@JoinColumn(name = "ticket_type", referencedColumnName = "id", insertable = false, updatable = false)
private TicketType ticketType;
// getters and setters
}
Spring Data JDBC 期望一对一关系的外键与一对多关系的方向相同。
虽然一开始这看起来很奇怪,但我确实认为它很有意义。 它与一对多的情况是对称的。 聚合根 (
Ticket
) 不应该依赖于引用的实体 (TicketType
),因此它也不应该在表中有引用,然后必须可以为空。
使用从引用实体指向聚合根的外键,它可以是not null
.
另见允许在正常方向上进行 FK [DATAJDBC-128]
就是说,从实体名称来看,您似乎不想创建一对一的关系,而是一对多的关系。 这些被建模为一个简单的 id 值,可以选择包装在 Spring Data JDBC 中的
AggregateReference
中。
有关详细信息,请参阅Spring Data JDBC、参考和聚合。