Java Spring实体继承,使用findOne时从存储库获取null
在spring,JPA中,我想将我的用户模型扩展到更多的用户类型。 我喜欢它在一张桌子上 我相信我的示例是正确的,但是对于Java Spring实体继承,使用findOne时从存储库获取null,java,spring-mvc,jpa,inheritance,spring-data-jpa,Java,Spring Mvc,Jpa,Inheritance,Spring Data Jpa,在spring,JPA中,我想将我的用户模型扩展到更多的用户类型。 我喜欢它在一张桌子上 我相信我的示例是正确的,但是对于findOne方法,我得到了null 你能帮我的忙吗?我不知道怎么了 以下是我的代码(我有更多的用户类型,但基本类型不起作用): 用户: @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="user_type") public abstract cla
findOne
方法,我得到了null
你能帮我的忙吗?我不知道怎么了
以下是我的代码(我有更多的用户类型,但基本类型不起作用):
用户:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type")
public abstract class User {
public LicenseType license = LicenseType.FREE;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long id;
public String username;
public String password;
@OneToOne(fetch = FetchType.LAZY)
public Country country;
@OneToOne(fetch = FetchType.LAZY)
public UserPhoto profilePhoto;
....
....
}
@Entity
@DiscriminatorValue("UserBasic")
public class UserBasic extends User {
}
UserBasic
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type")
public abstract class User {
public LicenseType license = LicenseType.FREE;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long id;
public String username;
public String password;
@OneToOne(fetch = FetchType.LAZY)
public Country country;
@OneToOne(fetch = FetchType.LAZY)
public UserPhoto profilePhoto;
....
....
}
@Entity
@DiscriminatorValue("UserBasic")
public class UserBasic extends User {
}
UserRepository
@NoRepositoryBean
public interface UserRepository<T extends User> extends Repository<T, Long>{
T findOne(Long id);
T findByFacebookId(Long facebookId);
}
public interface UserBasicRepository extends UserRepository<UserBasic>{
@Modifying
@Query(value="UPDATE User SET someField = now() WHERE id = ?1", nativeQuery= true)
long updateSomeField(Long userId);
}
问题更新 现在在评论之后,我打印了查询,我想我看到了问题所在
and userbasic0_.user_type='UserBasic'
我只是想要继承,没有要求额外的评论。我如何才能消除这种情况
Hibernate:
select
userbasic0_.id as id2_8_0_,
userbasic0_.password as passwor12_8_0_,
userbasic0_.username as usernam15_8_0_,
.....
from
User userbasic0_
where
userbasic0_.id=?
and userbasic0_.user_type='UserBasic'
您是如何保存用户的?数据库包含什么?你要通过哪个身份证。因为最明显的解释是这个用户根本不存在。你的评论确实有帮助,并说明了问题所在。更新问题好吧,你要求的是一个UserBasic。如果不使用鉴别器,hibernate怎么知道一行是UserBasic、UserFancy还是超级用户?这就是它的用途。我希望UserBasic只选择X列,而UserWithSuperPower可以选择所有列。有时我想要ID=100的UserBasic,有时我想要用ID=100的超级权限更新UserBasic。我只是希望select在剩下的时间里获得更少的非UserWithSuperPowerSpace的列,这不是实体继承的目的。实体继承允许在数据库中存储一只狗(ID=1)和一只猫(ID=2),然后通过ID=1查找动物并取回狗,通过ID=2查找动物并取回猫。您所寻找的是延迟加载属性,或者查询只选择少数属性而不是全部属性,或者JPA fetch组。你要做的是把狗存起来,然后希望它能像猫一样回来。这在设计上是不可能的。因为猫不是狗。