当前位置: 首页 > 面试题库 >

MappedSuperclass-更改子类中的SequenceGenerator

扈韬
2023-03-14
问题内容

我将JPA2与Hibernate结合使用,并尝试为我的实体引入一个通用的基类。到目前为止看起来像这样:

@MappedSuperclass
public abstract class BaseEntity {

    @Id
    private Long id;

    @Override
    public int hashCode() {
        // ...
    }

    @Override
    public boolean equals(Object obj) {
        // ...
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

但是,对于每个表,都有一个序列$entityname_seq要用作序列生成器。我该如何在子类中进行设置?我想我需要重写@GeneratedValue并使用@SequenceGenerator创建一个新的SequenceGenerator。


问题答案:

是的,有可能。您可以使用@SequenceGenerator注释覆盖默认的生成器名称。

  • 基类

    @MappedSuperclass
    public abstract class PersistentEntity implements Serializable
    {
        private static final long serialVersionUID = 1L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "default_gen")
        protected Long id = 0L;
    
        public Long getId()
        {
            return id;
        }
    
        public void setId(Long id)
        { 
            this.id = id;
        }
    }
    
  • 序列(SQL)

    create sequence role_seq;
    
  • 派生类

    @Entity
    @Table(name = "role")
    @SequenceGenerator(name = "default_gen", sequenceName = "role_seq", allocationSize = 1)
    public class Role extends PersistentEntity implements Serializable
    {
        private static final long serialVersionUID = 1L;
    
        @NotNull
        @Size(max = 32)
        private String name;
    
        public String getName()
        {
             return name;
        }
    
        public void setName(String name)
        {
             this.name = name;
        }   
    }
    
  • 这种方法在Hibernate 4.1.x中很好用,但是在EclipseLink 2.x中却没有。

编辑

  • 根据评论,它似乎与EclipseLink 2.6.1-RC1一起使用。


 类似资料:
  • 问题内容: 我的实体具有以下结构: 我得到以下异常: 当我在Intermed类上将@MappedSuperclass更改为@Entity时,一切正常。使用@MappedSuperclass和@SequenceGenerator是否有任何问题?还是我错过了什么? 问题答案: 这是JPA 1.0规范对注释的说明: 9.1.37 SequenceGenerator批注 该注解定义了可以由名称当用于指定的

  • 问题内容: 我有一个班级,其显示设置设置为Java,现在我将其设置为,我知道我可以使用with 进行此操作,但是用班级进行清洁的最干净的方法是什么? 问题答案: 您 可以使用数组(MDC链接,MSDN链接) 来 执行操作,实际上是更改与类相关的样式规则,但是坦率地说,您最好拥有一个单独的样式来定义,然后删除该样式(如changelog所述)从元素开始,当您希望它们不再隐藏时。

  • 我有以下Java超类,每个属性都有构造函数、getter和setter: 和一个car子类,它扩展了vehicle超类,并具有几个独特的属性: 我创建一个新的vehicle对象链表,并向其中添加一个新的car对象: 我可以用下面这样的函数更改属于vehicle超级类的任何属性: 但是当我试图创建一个类似的函数来更改其中一个子类属性时,我得到了这个错误:“方法setWheels(int)对于类型Ve

  • 我有类A和子类B和C。 我使用inheritanceType.single_table,一列type用作discriminatorColumn。 前面,B类有DiscriminatorValue(“1”),C类有DiscriminatorValue(“2”)。我有大约100多个条目在表中,所有的工作都很好。 会有什么问题?

  • 我有以下实体,它是应用程序中每个其他实体的基础实体: 我的目标是有两个表——图像和文件,以便这两个表共享给所有扩展BaseEntity的实体。我确实意识到,为此,所有扩展BaseEntity的实体都应该有一个共享id序列。 然后我有两个实体,它们是BaseEntity的子类型: 现在,当我设置时,hibernate为我生成以下表: 但是,我想要四张桌子: 我真的很感激任何帮助, 谢啦

  • 问题内容: 我想更改给定td标签ID的td标签的类: 我希望能够在其他dom对象的click事件中执行此操作。如何获取TD的ID并更改其类别? 问题答案: 您可以使用来 设置 类(无论它 是 什么),如下所示: 如果要 添加 类,请改用,如下所示: 或者是使用以下方法交换类的简便方法: 这是专门针对attribute 的jQuery方法的完整列表 。