java - 返回没有 parent 的实体?

标签 java sql jpa

我在图表中使用了以下类,因此可以有 parent 和 child :

@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);

    ...
}

父类(super class)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 constraint violation”:

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) 作为键

最佳答案

PedagogicalNeedEntity 之间的多对多数据库表 PEDAGOGICALNEED_PEDAGOGICALNEED 有一列 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(整数)
    • NODENAME 列(varchar(255) 可为空)
  • 表关系
    • 列 PARENTS_ID(整数)
    • CHILDREN_ID 列(整数)

关于java - 返回没有 parent 的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30501738/

相关文章:

mysql - 从表中删除 MySQL 列名中的所有空格?

python - 为什么 Django 会为 auth.User.username 设置一个较短的外键最大长度?

java - Observables 的单元测试客户端

java - 更改 GridView 中单元格的大小?

sql - SELECT TOP N 与变量

java - Hibernate 无法更新对象

spring - Spring Data JPA 如何在内部工作

java - WHERE 子句和通配符中的变量值

java - IncationTargetException 尝试创建服务类的新实例

java - 如果 NVIDIA 控制面板设置计算优化,cuCtxCreate 会失败