我的映射如下。
这是所有类的基类。这个班没有表格。所有子类用户标识为PK。
@MappedSuperclass
public abstract class Model {
private Long id;
@Id
@GeneratedValue(strategy=GenerationType.Sequence, generator="myGenerator")
public Long getId() { return id; }
}
具有自己的表的Comments类,其中包含Model
中所有字段的列@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@Table(name = "COMMENT")
@SequenceGenerator(name="myGenerator", sequenceName="COMMENT_SEQ", allocationSize=1)
public class Comment extends Model {
//some data
}
Comment的子类,它也有自己的表,其中包含Comment和Model
中所有字段的列@Entity
@Table(name = "ORDER_COMMENT")
@SequenceGenerator(name="myGenerator", sequenceName="ORDER_COMMENT_SEQ", allocationSize=1)
public class OrderComment extends Model {
//some data
}
此类有自己的表,可以有一对多的订单注释。
@Entity
@Table(name="ORDER")
@SequenceGenerator(name="myGenerator", sequenceName="ORDER_SEQ", allocationSize=1)
public class Order extends Model {
private Set<OrderComment> = new HashSet<OrderComment>();
@OneToMany
@JoinColumn(name="ORDER_ID")
public Set<OrderComment> getComments() { return comments; }
}
问题在于,当我向Order添加一个新的OrderComment时,Hibernate从Comment序列中选择id而不是OrderComment的序列。
关于为什么会发生这种情况以及我可以更改以解决此问题的任何想法?或者有更好的方法来映射这个吗?
答案 0 :(得分:1)
SequenceGenerator由其名称全局标识,因此您只能有一个名为“myGenerator”。
如果您希望在全局变量上使用您的标识符,使用@GeneratedValue,您需要定义一个@SequenceGenerator并对所有表使用单个序列。
或者,你可以在你的超类中保留一个抽象的getId方法,并在每个子类上实现它:hibernate很高兴,你将有一个统一的方式来达到你的id。
答案 1 :(得分:0)
我们在这里使用序列生成器使每个 Model 可区分,因此 Comment 是 Model , OrderComment 是模型,订单也是模型。他们应该从这个视图共享序列生成器。
您可以将多个实体使用的单个序列生成器定义为this post。