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

如何从Hibernate@MappedSuperclass重写方法,但保留原始映射?

雍宇定
2023-03-14

我有一个映射的超类,我用它来定义一个方法,它是持久性映射。我使用的是每类表继承策略。例如,这里有一些简单的类继承:

@MappedSuperclass
public class Feline {
    private Long id;
    private String identifier;

    @GeneratedValue(strategy = "GenerationType.AUTO")
    @Id
    public Long getId() {
        return id;
    }

    public String getIdentifier() {
        return identifier;
    }
    // other getters and setters, methods, etc.
}

下一个类不会重写getIdfier()方法,并将Cat的标识符保存在其实体表的“标识符”列中。

@Entity
public class Cat extends Feline {
    private Date dateOfBirth;
    private Set<Kitten> kittens;

    @OneToMany(mappedBy = "mother")
    public Set<Kitten> getKittens() {
        return kittens;
    }
    // other getters and setters, methods, etc.
}

在Kitten类中,我想更改标识符以返回Kitten。识别码:莫特的小猫。getIdentifier()或例如“Boots kitten of Ada”,并将该字符串持久保存在实体表的“identifier”列中。

@Entity
public class Kitten extends Cat {
   private Cat mother;

   @ManyToOne
   public Cat getMother() {
       return mother;
   }

   @Override
   public String getIdentifier() {
       return this.getIdentifier() + " kitten of " + mother.getIdentifier(); 
   }
}

当我运行这段代码时,我收到一条错误消息“由以下原因引起:org.Hibernate.MappingException:在com.example.Kitten中找到的标识符的重复属性映射。”

因为我扩展了一个@Mappedsuperclass,所以标识符字段应该映射到每个实体表的“identifier”列,但是由于某种原因,这并没有发生,当我在Kitten类中重写getIdentifier()方法时,它试图映射标识符字段两次。

Cat和Kitten表都有“identifier”列。我不明白如果一个方法返回正确的类型映射到同一列,为什么我不能重写它。

共有1个答案

墨阳羽
2023-03-14

那不行。但是你可以定义一个鉴别器。

看看http://docs . JBoss . org/hibernate/ORM/3.3/reference/en/html/inheritance . html

 类似资料:
  • 问题内容: 通用实体,超类: pojo: 我尝试使用那些注释:@ AttributeOverride,@ Id等,但是它不起作用。你能帮助我吗?我想覆盖属性“ id”以通过pojo / table指定另一个列名和一个序列。最好的方法是什么? 问题答案: 试试这个,代替

  • 我有以下PHP重定向脚本: 这将根据的值将用户重定向到不同的页面。推荐人成为重定向页面本身。 如何保留原始的“推荐人”字段?

  • 好的,我有一个网页,为用户提供了一些步骤,还有一个mixin,它处理这些步骤的属性和逻辑,比如当前/下一步的值,检查用户从每个步骤前进到下一个步骤,等等。 现在我必须添加一个新的功能,只有在某个步骤之后才能执行,所以我想能够做的是调用原始的mixin方法,用户每次进入下一步添加此功能时都会调用该方法。 更清楚地说,在webapp的许多页面中使用了混合方法,所以我想覆盖扩展它的组件中的罪魁祸首混合方

  • 我有以下代码: 但是由于某种原因,$_SESSION变量不保留值。输出如下: 注意:未定义的索引:lang in/home/claudio/public_html/index。第13行的php数组()数组([get]= 警告:需要(lang/. php):打开流失败:第23行的 /home/claudio/public_html/index.php中没有这样的文件或目录 致命错误:require(

  • 我正在做Java类练习。我有一段代码,其中包含一个重载方法: 主要: 当我在main中调用方法时,我预计会出现错误,但它调用方法而我的是一个数字,它的大小大于的大小(8字节/4字节)所以我想知道这些原始类型是如何工作的?

  • 问题内容: 我有一类通用的代码是线程安全的。 该类中的方法之一是抽象的,需要针对不同的实现重写。 我需要确保或至少向其他开发人员标记此方法的所有实现都必须是线程安全的。 做这个的最好方式是什么? 是否有关键字或注释可达到此目的? 我已经尝试过了,但是不允许使用关键字组合。 问题答案: 您不能直接这样做。您可以做的一件事是将方法具体化,但是调用一个抽象方法: 这样,doFoo()将始终*在foo()