4

我尝试有 2 个表,如下所示:

MISExercise(表)


身份证名称...

2个


MISInteractiveExercise(表)


身份证名称...

1个


他们必须没有相同的 id。他们是从同一个基地继承而来的。我的代码是:

@MappedSuperclass  
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class MISExerciseBase {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Integer id; 

    ...
}

@Entity
public class MISExercise extends MISExerciseBase{
   ...
}

@Entity
public class MISInteractiveExercise extends MISExerciseBase{
   ...
}

不幸的是,我发现 MISExercise 表和 MISInteractiveExercise 表可以具有相同的 id。当我用谷歌搜索时,我发现http://openjpa.208410.n2.nabble.com/same-Id-on-mapped-superclass-td2435374.html。@Kaayan 似乎有同样的问题。但我无法从该页面获得帮助。

似乎如果我使用@Entity 而不是@MappedSuperclass,那就没问题了。但是为什么,什么是好方法?

4

2 回答 2

3

由于您的类MISExerciseMISInteractiveExersice都继承自MISExerciseBase,并且您已将生成策略设置为@GeneratedValue(strategy = GenerationType.TABLE),因此您id的 's 不会在所有表中都是唯一的,而只会在每个表中唯一。

如果您想在多个表中拥有唯一的 id,即在您的情况下MISExerciseMISInteractiveExerice,您需要将您的生成策略更改为Auto.

因此,要解决您的问题,请将抽象类 MISExerciseBase 更改为此...

@MappedSuperclass  
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class MISExerciseBase {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO) //NOTE This Change to AUTO
    private Integer id; 

    ...
}
于 2013-12-19T15:19:24.643 回答
0

我遇到了类似的问题。这通过将其添加为类级别注释为我修复了它:

@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "parentseq", allocationSize = 1)

您不需要指定所有这些东西,但重要的部分是sequenceName确保子类使用与父类相同的子类。

于 2019-04-05T17:12:25.527 回答