在使用Hibernate和MySQL的Spring MVC应用程序中,我有一个抽象的超类BaseEntity,它管理模型中所有其他实体的ID值.该id领域使用@GeneratedValue.每当我的代码试图保存任何扩展的子类时,我都会遇到问题BaseEntity.这个问题带有的选择GenerationType了@GeneratedValue.
在我的代码中BaseEntity尝试保存到底层MySQL数据库的子类的每个地方,我收到以下错误:
ERROR SqlExceptionHelper - Table 'docbd.hibernate_sequences' doesn't exist
Run Code Online (Sandbox Code Playgroud)
我已经在SO和谷歌上阅读了很多关于此的帖子,但是他们要么处理其他数据库(不是MySQL),要么他们不处理抽象超类.我无法通过使用来解决问题,GenerationType.IDENTITY因为我使用抽象超类来管理id模型中所有实体的字段.同样,我不能使用,GenerationType.SEQUENCE因为MySQL不支持序列.
那么我该如何解决这个问题呢?
这是以下代码BaseEntity.java:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
protected Integer id;
public void setId(Integer id) {this.id = id;}
public Integer getId() {return id;}
public boolean isNew() {return (this.id == null);}
}
Run Code Online (Sandbox Code Playgroud)
以下是扩展的实体之一的代码示例BaseEntity:
@Entity
@Table(name = "ccd")
public class …Run Code Online (Sandbox Code Playgroud) 亲爱的未来读者:在完成Sannes 的回答和他提供的链接之后,我决定改用 Sequence。较新的 Hibernates 注意它也适用于 MySQL。
我有一个abstract类,其中包含我希望在所有实体中拥有的一些基本值(例如 ID、创建日期、创建用户等)。目前,我在为每个具体类拥有一张表并使其 id 工作的组合而苦苦挣扎。
似乎我可以为每个班级设置一个表,也可以在一个地方设置 ID,但不能同时设置两者。这对我来说似乎很奇怪而且不太可能,所以我想确保情况确实如此。
可能相关的版本:hibernate 5、mysql 5.5、java 1.8、spring 4.3。
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@MappedSuperclass
public abstract class GeneralData implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
protected int id;
protected String name;
// getters, setters, constructors, etc.
}
Run Code Online (Sandbox Code Playgroud)
示例子类:
@Entity
public class ExampleClass extends GeneralData {
// own values, constructors, getters, setters, etc.
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
Cannot use identity column key generation with <union-subclass> mapping for: org.example.ExampleClass …Run Code Online (Sandbox Code Playgroud) 我有一组来自不同来源的付款对象,我想在NHibernate中使用TPC继承.所有这些对象的基础是支付处理器(因此所有对象都具有一致的格式),但是数据库中没有基类的表示.我想我的映射已经解决了,除了我在尝试插入时抛出异常的事实 - "不能使用带有<union-subclass>映射的身份列密钥生成:<EntityName>"
类别:
public class BasePayment
{
public virtual int Id { get; set; }
public virtual PaymentSource Source { get; set; }
public virtual DateTime Date { get; set; }
public virtual decimal Amount { get; set; }
}
public class SubPayment : BasePayment
{
}
Run Code Online (Sandbox Code Playgroud)
映射:
public class BasePaymentMap : ClassMap<BasePayment>
{
public BasePaymentMap()
{
UseUnionSubclassForInheritanceMapping();
DiscriminateSubClassesOnColumn("Source");
Id(m => m.Id);
Map(m => m.Source);
Map(m => m.Amount);
Map(m => m.Date);
}
}
public class SubPaymentMap : SubclassMap<SubPayment>
{ …Run Code Online (Sandbox Code Playgroud) hibernate ×2
java ×2
jpa ×2
mysql ×2
c# ×1
database ×1
inheritance ×1
persistence ×1
spring ×1