Java 当在父实体中定义id时,hibernate中的get by id返回null
我有3个实体,都映射到同一个基表,如下所示: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
@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);
}
}