java - hql 查询将数据保留在具有多对一关系的表中

标签 java hibernate hql

@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/

相关文章:

java - TableView - 尝试使其表现得像 Excel

java - 当我使用 new Thread().interrupt(); 时,线程真的停止了吗?

java - BufferedReader readLine() - 输入特定字符串时退出

java - Hibernate + MySQL 报告数据的最佳实践

java - 以 UUID 作为参数的 Hibernate 命名查询

string - 将实体中的列表转换为数据库中的单个字符串列

java - 使用 Hibernate 创建/重新创建表后立即自动插入第一行

java - HQL:交叉连接

java - HQL查询会不会使用Hibernate二级缓存

Java Long 的最大质因数