繁体   English   中英

返回没有父母的实体?

[英]Returning the entities with no parents?

我有一个图表中使用的以下类,因此可以有父母和孩子:

@Entity(name = "PedagogicalNeed")
@Table(name = "PedagogicalNeed")
public class PedagogicalNeedEntity extends AbstractEntity implements PedagogicalNeed {

    private String name;

    private String description;

    @ManyToMany(targetEntity = PedagogicalNeedEntity.class, fetch = FetchType.LAZY)
    private Set<PedagogicalNeed> parents = new HashSet<PedagogicalNeed>(0);

    @ManyToMany(targetEntity = PedagogicalNeedEntity.class, fetch = FetchType.LAZY)
    private Set<PedagogicalNeed> children = new HashSet<PedagogicalNeed>(0);

    ...
}

超类AbstractEntity用于定义@Id字段:

@MappedSuperclass
public abstract class AbstractEntity implements Serializable {
    ...
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    ...
}

我有以下请求,应返回“parents”集合为空的实体。

@Query("SELECT pn FROM PedagogicalNeed pn WHERE pn.parents IS EMPTY")
Iterable<PedagogicalNeedEntity> findRoots();

我的问题是,当执行此请求时,我得到以下“NOT NULL约束违规”:

Caused by: org.hsqldb.HsqlException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10102 table: PEDAGOGICALNEED_PEDAGOGICALNEED column: PARENTS_ID

问题 :如何返回没有父母的实体?

更新 :生成的架构如下:

CREATE MEMORY TABLE PUBLIC.PEDAGOGICALNEED(ID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY,DESCRIPTION VARCHAR(255),NAME VARCHAR(255))
ALTER TABLE PUBLIC.PEDAGOGICALNEED ALTER COLUMN ID RESTART WITH 1
CREATE MEMORY TABLE PUBLIC.PEDAGOGICALNEED_PEDAGOGICALNEED(
    PEDAGOGICALNEED_ID BIGINT NOT NULL,
    PARENTS_ID BIGINT NOT NULL,
    CHILDREN_ID BIGINT NOT NULL,
    PRIMARY KEY(PEDAGOGICALNEED_ID,CHILDREN_ID),
    CONSTRAINT FK_GSX50JH17YMGUMDQ7ADD0Y0Y5 FOREIGN KEY(PARENTS_ID) REFERENCES PUBLIC.PEDAGOGICALNEED(ID),
    CONSTRAINT FK_L6QY3L7AMTRVX1O62WVS6C9X8 FOREIGN KEY(PEDAGOGICALNEED_ID) REFERENCES PUBLIC.PEDAGOGICALNEED(ID),
    CONSTRAINT FK_EHV0QET4GVHBX733YJV6Q9KQD FOREIGN KEY(CHILDREN_ID) REFERENCES PUBLIC.PEDAGOGICALNEED(ID))

我不明白这个映射,为什么有一个表“PEDAGOGICALNEED_PEDAGOGICALNEED”有三个字段? PedagogicalNeedEntity与其父母之间的联系与同一实体及其子女之间的联系无关。 所以应该有两个表而不仅仅是一个,每个表只有两列:

  • 第一个表应该有(PEDAGOGICALNEED_ID,CHILDREN_ID)作为键
  • 第二个表应该具有(PEDAGOGICALNEED_ID,PARENTS_ID)作为键

您的数据库表PEDAGOGICALNEED_PEDAGOGICALNEED用于PedagogicalNeedEntity之间的PEDAGOGICALNEED_ID具有从未填充的列PEDAGOGICALNEED_ID

在PedagogicalNeedEntity中为ID列提供列定义(伪代码):

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

您可以自己提供id(在持久化实体之前)或使用生成的id值。

重要提示 :为避免冗余,您不应在两种关系上使用@JoinTable 在一个关系上使用@JoinTable在另一个关系上使用mappedBy

一个简单的例子,展示如何创建这样的“节点网”(使用Hibernate 4.3.8和Derby 10.9.1.0测试):

@Entity
public class Node {

    @Id
    public int id;

    public String nodeName;

    @ManyToMany
    @JoinTable(name="relationships")
    public List<Node> parents;

    @ManyToMany(mappedBy="parents")
    public List<Node> children;

    public static void main(String[] args) {
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistenceUnit");
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        entityManager.persist(new Node());
        transaction.commit();
        entityManager.close();
    }

}

这将创建两个表:

  • 表节点
    • 列ID(int)
    • 列NODENAME(varchar(255)可为空)
  • 表关系
    • 列PARENTS_ID(int)
    • 列CHILDREN_ID(int)

这不是由查询引起的异常。 它必须是在查询之前触发的持久操作的例外。

持久性提供程序必须在执行查询之前刷新所有dml语句。

PEDAGOGICALNEED_ID列在数据库中不能为空,但您没有为该列提供值。

查询看起来很好。

更新 :这不起作用,请参阅了解如何获得单个连接表的最佳答案。


问题解决了! 我只需要指定“连接表”的名称:

@ManyToMany(targetEntity = PedagogicalNeedEntity.class, fetch = FetchType.LAZY)
@JoinTable(name="PedagogicalNeed_parents")
private Set<PedagogicalNeed> parents = new HashSet<PedagogicalNeed>(0);

@ManyToMany(targetEntity = PedagogicalNeedEntity.class, fetch = FetchType.LAZY)
@JoinTable(name="PedagogicalNeed_children")
private Set<PedagogicalNeed> children = new HashSet<PedagogicalNeed>(0);

谢谢你的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM