当前位置: 首页 > 知识库问答 >
问题:

组织。冬眠通过hibernate和抽象类继承加载实体时出现错误ClassException

韦澄邈
2023-03-14

问题:

我是否需要删除接口IAbstractUserService上的泛型?

是否与此答案的类型擦除有关?https://stackoverflow.com/a/31266152/6698175

问题:

我得到了这个例外:

<代码>组织。冬眠ErrorClassException:对象[id=1]不属于指定的子类[com.faz.idb.models.advisor]:加载的对象属于错误的com类。法兹。idb。模型。客户

尝试加载实体时:

T getUserByEmail(String email);

像这样:

AbstractUserServiceImpl<? extends AbstractUser> userService;
AbstractUser user = userService.getUserByEmail(email);

目前我有:

<代码>Hibernatev7.0.3。最终

抽象父类:AbtrsactUser

子类:客户和顾问;

@Getter
@Setter
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "user_type", discriminatorType = DiscriminatorType.STRING)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(name = "customer", value = Customer.class),
        @JsonSubTypes.Type(name = "adviser", value = Adviser.class)
})
@DiscriminatorOptions(force = true)
public abstract class AbstractUser { ........ }


@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@DiscriminatorValue("adviser")
@DiscriminatorOptions(force = true)
public class Adviser extends AbstractUser { ........ }


@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@DiscriminatorValue("customer")
@DiscriminatorOptions(force = true)
public class Customer extends AbstractUser { ........ }

服务:

public interface IAbstractUserService<T extends AbstractUser> {
        T getUserByEmail(String email);

实施:

@Service public class AbstractUserServiceImpl<T extends AbstractUser> implements IAbstractUserService<T> {

    @Autowired
    private AbstractUserRepository<T> userRepository;

    @Override
    public T getUserByEmail(String email) {
        return userRepository.findByEmail(email).orElse(null);
    }

存储库:

@Repository公共接口AbstractUserRepository扩展JpaRepository

生成的SQL:

Hibernate:选择abstractus0\u0。id为id2\u 0\uAbstractus0\u。电子邮件格式为email3\u 0\uAbstractus0\u。密码为password4\u 0\uAbstractus0\u。user\u type as user\u typ1\u 0\ufrom abstract\u user abstractus0\uwhere abstractus0\u。user\u键入('advisor','customer')和abstractus0\u。电子邮件=?

Hibernate:选择person0\u0。customer\u id为customer1\u 5\u 0\u,person0\u。first\u名称为first\u na2\u 5\u 0\u,person0\u。性别为gender3\u 5\u 0\u,person0\u。last\u名称为last\u nam4\u 5\u 0\u,建议1\u。id为id2\U 0\U 1\uAdviser1\u。电子邮件格式为email3\u 0\u 1\u,adviser1\u。密码为password4\u 0\u 1\ufrom person0\uLeft outer join abstract\u user adviser1\uon person0\u。customer\u id=adviser1\u。id,其中person0\u0。客户id=?2022-03-14 06:14:34.029

信息79095---[nio-8080-exec-2]o.h.e.内部。DefaultLoadEventListener:hh000327:执行load命令时出错

在我的数据库中,我只有一个用户:

用户类型| id |电子邮件|密码

客户| 1 |xyz@live.fr | ....

共有1个答案

南宫凯康
2023-03-14

问题解决了。

我在@OneToOne关系的子实体中使用了不带@JoinColumn(name=“id”)的@MapsId。

说明:

“AbstracUser”由“Customer”实体扩展,他与“PersonDetails”有@OneToOne关系。

所以在《客户》中,我有:

@OneToOne(mappedBy = "Customer", fetch = FetchType.LAZY, 
cascade {CascadeType.ALL}, optional = false)  
@PrimaryKeyJoinColumn  private PersonDetails person;

和人物详情:

@MapsId()
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name="id")
private Customer customer;

解决方案是在

@MapsId("id")

@MapsId
@JoinColumn(name="id")

N、 B类

  • 还要确保通过“设置”对应的对象来同步关系的双方。(ressource我使用)
  • 为了更好的架构,我最终将@OneToOne关系放在“AbstractUser”实体(而不是客户)中。
 类似资料:
  • 在这个问题中,我正在使用Hibernate 4.3.4。最终和SpringORM 4.1.2。释放。 我有一个User类,它包含这样的一组Card实例: 我有几种类型的卡,每种都分别扩展Card基类和CardInstance基类,如下所示: 如果我将UnitCardInstance或HeroCardInstance添加到cards集合并保存实体,则一切正常。但是,如果我向集合中添加AbilityC

  • 问题内容: 通过使用抽象类,我们可以实现与接口相同的功能,那么为什么Java不允许以下代码? 我知道可以通过仅使用接口来实现多重继承,但是上面的代码与接口所做的事情相同。 问题答案: 不允许这样做,因为您可以对抽象类做更多的事情。允许多重继承是没有意义的,前提是您只在可以使用接口的情况下才使用抽象类。 仅将抽象类用于无法通过接口执行的操作会更简单,在这种情况下,您将无法使用两个抽象父类。 注意:使

  • 问题内容: 您将如何在以下示例代码中配置注释?我只想保留JPA注释,避免使用Hibernate特定的依赖项。 下面的代码正确吗? (这些类将具有多个版本,RefSomeOtherExample等,并且每个类一个db表。有些可能会添加其他字段(列),但大多数只会使用继承自“ RefData”基类的基本字段。) 基类: 最终,我想使用Hibernate的SchemaExport类从中生成模式创建脚本。

  • 继承一个可以实现的普通超类有什么不同吗? atm我有一个名为的抽象类,我有/扩展这个。 abstractcar中的一个字段设置为"私有int容量" 但是在子类“小型汽车”中,当我输入“容量”作为构造函数中使用的变量时,它说“容量在抽象汽车中有私有访问” 我想: > 子类继承超类的所有字段和方法? 我现在该怎么进行?

  • 我有一个抽象类,这个类是在她的子类中扩展的: < li >我在这个抽象类上实现了一个方法,并抽象了另一个方法 < li >实现的方法是每个子类对象都必须访问的通用方法。所以我决定在抽象类上实现它,避免在每个子类上实现相同的方法。 小例子: 我想听听你对这种实施方式的看法, 问候。

  • 我在Hibernate中使用注释。我得到这个错误: 组织。冬眠MappingException:未知实体:xyz。豆在组织进行测试。冬眠实施。SessionFactoryImpl。位于org的getEntityPersister(SessionFactoryImpl.java:550)。冬眠事件def。DefaultLoadEventListener。org上的onLoad(DefaultLoad