Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当在父实体中定义id时,hibernate中的get by id返回null_Java_Hibernate_Single Table Inheritance - Fatal编程技术网

Java 当在父实体中定义id时,hibernate中的get by id返回null

Java 当在父实体中定义id时,hibernate中的get by id返回null,java,hibernate,single-table-inheritance,Java,Hibernate,Single Table Inheritance,我有3个实体,都映射到同一个基表,如下所示: @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn( discriminatorType = DiscriminatorType.STRING, name = "disc_type" ) public class Parent { @Id @GeneratedValue(strategy = GenerationType.ID

我有3个实体,都映射到同一个基表,如下所示:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
   discriminatorType = DiscriminatorType.STRING,
   name = "disc_type"
)
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "unique_id", nullable = false)
    private long id;
}

@DiscriminatorValue(value = DiscType.Values.ONE)
public class Child1 extends Parent {
}

@DiscriminatorValue(value = DiscType.Values.TWO)
public class Child2 extends Parent {
}
对我来说不起作用的是,当我尝试为子实体获取id时-我本以为以下代码会起作用(并添加匹配的disc_类型筛选器),但不幸的是-这返回空值:

return sessionFactory.getCurrentSession().get(Child1.class, id);
这将返回(如预期的)父对象:

return sessionFactory.getCurrentSession().get(Parent.class, id);

我需要返回一个Child1实体,而将父实体转换为Child1似乎是一个非常糟糕的解决方案。关于如何克服这一问题的想法?

我已经尝试了以下代码,并且效果良好(希望这有帮助):

更新:

public interface Child1Repository extends CrudRepository<Child1, Long> {
}

@Component
@AllArgsConstructor
public class ApplicationRunner implements CommandLineRunner {
    private final EntityRepository repository;
    private final Child1Repository child1Repository;

    @Override
    public void run(String... args) throws Exception {
        repository.save(new Child1());
        repository.save(new Child2());
        Parent one = repository.findById(1L).get();
        System.out.println(one);
        Parent two = repository.findById(2L).get();
        System.out.println(two);
        Child1 child1 = child1Repository.findById(1L).get();
        System.out.println(child1);
    }
}
公共接口Child1Repository扩展了crudepository{
}
@组成部分
@AllArgsConstructor
公共类ApplicationRunner实现CommandLineRunner{
私有最终实体存储库;
私人最终子女1安置子女1安置;
@凌驾
公共无效运行(字符串…参数)引发异常{
save(newchild1());
save(new Child2());
父对象=repository.findById(1L.get();
系统输出打印项次(一);
父二=repository.findById(2L.get();
System.out.println(两个);
Child1 Child1=child1Repository.findById(1L.get();
系统输出打印项次(child1);
}
}

不幸的是,我没有真正解决我的问题-我需要一个Child1对象,而不是父对象。同样,我可以转换显然,Hibernate不允许我直接对Child1实体执行get对我来说很奇怪。你可以添加专用于Child1的存储库(查看答案的更新部分)谢谢,看起来不错。一旦我将实现,将标记为已回答:)
Hibernate: insert into parent (unique_id, disc_type) values (null, 'ONE')
Hibernate: insert into parent (unique_id, disc_type) values (null, 'TWO')
Hibernate: select parent0_.unique_id as unique_i2_2_0_, parent0_.disc_type as disc_typ1_2_0_ from parent parent0_ where parent0_.unique_id=?
Parent(id=1)
Hibernate: select parent0_.unique_id as unique_i2_2_0_, parent0_.disc_type as disc_typ1_2_0_ from parent parent0_ where parent0_.unique_id=?
Parent(id=2)
public interface Child1Repository extends CrudRepository<Child1, Long> {
}

@Component
@AllArgsConstructor
public class ApplicationRunner implements CommandLineRunner {
    private final EntityRepository repository;
    private final Child1Repository child1Repository;

    @Override
    public void run(String... args) throws Exception {
        repository.save(new Child1());
        repository.save(new Child2());
        Parent one = repository.findById(1L).get();
        System.out.println(one);
        Parent two = repository.findById(2L).get();
        System.out.println(two);
        Child1 child1 = child1Repository.findById(1L).get();
        System.out.println(child1);
    }
}