gpt4 book ai didi

java - Hibernate 使用 JoinTable 为可选的双向 OneToOne 生成错误查询

转载 作者:行者123 更新时间:2023-11-29 02:17:00 25 4
gpt4 key购买 nike

我有两个实体:

  • RawDeviceMessage 表示来自设备的原始消息
  • TagDetail代表解析后的消息

TagDetail 可能与 RawDeviceMessage 关联也可能不关联,因为它可能直接创建而无需解析原始消息。因此,我在 RawDeviceMessage 和 TagDetail 之间有一个可选的双向 OneToOne 关系。

在数据库中我有下表:

  • raw_device_message(id + 其他列)
  • tag_detail(id + 其他列)
  • tag_detail_has_raw_device_message(tag_detail_idraw_device_message_id):此表是一个 JoinTable,具有适当的 SQL 约束和外键以在数据库级别。

我已经像那样映射了我的 Java 类:

原始设备消息

@Entity
@Table(name = "raw_device_message")
public class RawDeviceMessage implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, updatable = false, nullable = false)
private Long id;

@OneToOne(mappedBy = "rawDeviceMessage", fetch = FetchType.LAZY)
private TagDetail tagDetail;

public RawDeviceMessage(){}

public Long getId(){...}
public void setId(final Long id){...}
public TagDetail getTagDetail(){...}
public RawDeviceMessage setTagDetail(TagDetail tagDetail){...}

}

标签详情

@Entity
@Table(name = "tag_detail")
public class TagDetail implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, updatable = false, nullable = false)
private Long id;

@OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.REFRESH, CascadeType.MERGE })
@JoinTable(
name="tag_detail_has_raw_device_message",
joinColumns=@JoinColumn(name="tag_detail_id"),
inverseJoinColumns=@JoinColumn(name="raw_device_message_id"))
private RawDeviceMessage rawDeviceMessage;

public TagDetail() {}

public Long getId(){...}
public void setId(final Long id){...}
public RawDeviceMessage getRawDeviceMessage(){...}
public void setRawDeviceMessage(RawDeviceMessage rawDeviceMessage){...}
}

问题

我的问题是,在对 RawDeviceMessage 资源执行全部查找时,Hibernate 生成了错误的 SQL 查询:

SELECT rawdevicem0_.id AS id1_15_,
rawdevicem0_2_.tag_detail_id AS tag_deta0_37_,
FROM raw_device_message rawdevicem0_
LEFT OUTER JOIN tag_detail_has_raw_device_message rawdevicem0_2_ ON rawdevicem0_.id=rawdevicem0_2_.tag_detail_id
CROSS JOIN tag_detail tagdetail1_
LEFT OUTER JOIN tag_detail_has_raw_device_message tagdetail1_1_ ON tagdetail1_.id=tagdetail1_1_.tag_detail_id
WHERE rawdevicem0_2_.tag_detail_id=tagdetail1_.id
ORDER BY rawdevicem0_.id ASC

如您所见,在第一个 LEFT OUTER JOIN 中,连接条件是 rawdevicem0_.id=rawdevicem0_2_.tag_detail_id

它尝试将 raw_device_message.idtag_detail_has_raw_device_message.tag_detail_id 连接起来,这没有任何意义并且会弄乱所有结果。

加入条件应该是 rawdevicem0_.id=rawdevicem0_2_.raw_device_message_id此条件将正确加入 raw_device_message.idtag_detail_has_raw_device_message.raw_device_message_id

我已经缩短了 hibernate 生成的查询以删除所有不相关的字段,但是在生成的查询中没有列 raw_device_message_id,所以肯定有问题。

是 hibernate 错误还是我做错了映射?

最佳答案

如果tag_detail_has_raw_device_message表的目的只是链接两张表,那么可以drop掉。您可以只用两个表进行一对一。更多细节在这里 - Setting up a One To ManyJoins Against a Bridge Table using JPA

但是如果你想要一个中间映射表,因为它有一些关于这种关系的额外信息,那么这里有更多细节。

http://what-when-how.com/hibernate/advanced-entity-association-mappings-hibernate/

关于java - Hibernate 使用 JoinTable 为可选的双向 OneToOne 生成错误查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38016739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com