@Entity(name="card")
public class Card {
@Id
@GenericGenerator(name="generator",strategy="increment")
@GeneratedValue(generator="generator")
private int id;
@Transient
private int slotID;
@Column(name="macId")
private String macId;
private String cardType;
/* getter and setters */
}
@Entity(name="PhysicalPort")
public class PhysicalPort {
@Id
@GenericGenerator(name="generator",strategy="increment")
@GeneratedValue(generator="generator")
private int id;
@Column(name="cardPort")
private int cardPort;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="cardId")
private Card cardInfo;
/* getter and setters */
}
在存储库类中,我使用下面的查询来保存数据
sessionFactory.getCurrentSession().persist(physicalPort);
在保留数据时,我只需要在 PhysicalPort 表中添加数据,并使用卡表 id 作为引用键,但数据也会使用新的 id 添加到卡表中。
最佳答案
您保存了两张卡,因为您的对象作为新对象传递:
这是你的 Json:
{“cardPort”:“1”,“interfaceName”:“E1”,“state”:“启用”,“fec”:true,“systemLoopback”:false,“rxBytes”:513,“rxPackets”:0,“rxErrorPackets”:571017851,“rxPacketsDrops”:1852797802,“txBytes”:18691 16517,“txPackets”:154804836,“txErroPackets”:0,“txPacketsDrops”:0,“时间”:“23:56:35”,“内存总计”:4278190080,“内存空闲”:4294967295,“cpuuser”:996646,“cpusys”:1040 71、 "cardInfo": { "cardType":"TDM", "macId":"12"} }
您的cardInfo属性设置如下:
"cardInfo": { "cardType":"TDM", "macId":"12"}
因此,您告诉实体管理器,添加一个不带 id (id = null) 的 cardInfo,因为未指定。
因此,当您尝试保存 PhysicalPort 对象时,行为是:
检查外键字段(您的 cardInfo 属性),该对象没有 id 值,因此这是一个新对象 -> INSERT INTO
检查PhysicalPort对象并在PhysicalPort中添加一个新行。
如果您想修复代码,当您传递 cardInfo 对象时,请显式传递该表中显示的行 ID 值,如下所示:
"cardInfo": { "id":"行 ID 的值", "cardType":"TDM", "macId":"12"}
关于java - hql 查询将数据保留在具有多对一关系的表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32496823/