实体继承和鉴别器列

发布于 2025-01-04 07:38:21 字数 4228 浏览 4 评论 0原文

我正在尝试测试一些 DAO。

我有一个名为 Nomination 的实体(和表),它有一些属性:

@Entity(name = "Nomination")
@Table(name = "NOMINATION")
@DiscriminatorColumn(name="CATEGORY_CODE", discriminatorType = DiscriminatorType.STRING, length = 1)

public class Nomination extends AuditableEntity {

@Id
@Column(name = "NOM_ID", insertable = true, updatable = true,
        nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Transient
protected NominationType type = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "PERIOD_ID", referencedColumnName = "PERIOD_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private NomPeriod period = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "CATEGORY_CODE", referencedColumnName = "CATEGORY_CODE")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private Category category = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "NOMINATOR_ID", referencedColumnName = "EMP_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private Employee nominator = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "STATUS_ID", referencedColumnName = "STATUS_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private Status status = null;

//more after this line

现在我有 4 种不同类型的提名(想法、团队、成功和同事提名)和 4 个不同的表(提名、team_nom、想法名称、成功名称)。其中一个(提名)具有公共栏。这与我的第一种提名类型(名为 CoworkerNom)一致。这个没有单独的表,因为它只需要提名表中列出的内容。其他 3 项提名为:TeamNomSuccessNomIdeaNom。它们有自己的表,因为它们有附加数据,因此它们也有自己的实体。例如:

@Entity(name = "IdeaNom")
@Table(name = "IDEA_NOM")
@DiscriminatorValue("I")

public class IdeaNom extends Nomination {

@Column(name = "PURPOSE_INC", insertable = true, updatable = true,
        nullable = true)
private Boolean purposeIncrease;

@Column(name = "PURPOSE_SIMPLIFY", insertable = true, updatable = true,
        nullable = true)
private Boolean purposeSimplify;

//more after this line

此结构适用于 SuccessNomTeamNom

我在理解如何做到这一点时遇到了问题,但现在我已经做了一些 DAO 并正在尝试测试它们。但是我收到以下错误:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: 

com.dev.test.data.entity.SuccessNom column: CATEGORY_CODE (should be mapped with insert="false" update="false")
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676)
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698)
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:720)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:474)
    at org.hibernate.mapping.SingleTableSubclass.validate(SingleTableSubclass.java:65)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1362)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:860)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:779)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1479)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
    ... 54 more

首先,CATEGORY_CODE 是鉴别器...但它应该是可写的。希望你们能够再次帮助我。

编辑:这是我的架构

Schema

I am trying to test some DAOs.

I have Entity (and table) named Nomination, it has some properties:

@Entity(name = "Nomination")
@Table(name = "NOMINATION")
@DiscriminatorColumn(name="CATEGORY_CODE", discriminatorType = DiscriminatorType.STRING, length = 1)

public class Nomination extends AuditableEntity {

@Id
@Column(name = "NOM_ID", insertable = true, updatable = true,
        nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Transient
protected NominationType type = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "PERIOD_ID", referencedColumnName = "PERIOD_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private NomPeriod period = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "CATEGORY_CODE", referencedColumnName = "CATEGORY_CODE")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private Category category = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "NOMINATOR_ID", referencedColumnName = "EMP_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private Employee nominator = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "STATUS_ID", referencedColumnName = "STATUS_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private Status status = null;

//more after this line

Now I have 4 different types of Nomination (idea, team, success, and coworker nominations) and 4 different tables(nomination, team_nom, idea_nom, success_nom). One (NOMINATION) has the common columns. This coincides with my first type of Nomination called CoworkerNom. There is no separate table for this one, since it only needs what's listed in the NOMINATION table. The other 3 Nominations are: TeamNom, SuccessNom, and IdeaNom. These have their own tables as they have additional data, and so they also have their own Entities. For example:

@Entity(name = "IdeaNom")
@Table(name = "IDEA_NOM")
@DiscriminatorValue("I")

public class IdeaNom extends Nomination {

@Column(name = "PURPOSE_INC", insertable = true, updatable = true,
        nullable = true)
private Boolean purposeIncrease;

@Column(name = "PURPOSE_SIMPLIFY", insertable = true, updatable = true,
        nullable = true)
private Boolean purposeSimplify;

//more after this line

This structure applies to SuccessNom and TeamNom.

I am having problems understanding how to do this, but for now I have done some DAOs and am trying to test them out. However I am getting the following error:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: 

com.dev.test.data.entity.SuccessNom column: CATEGORY_CODE (should be mapped with insert="false" update="false")
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676)
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698)
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:720)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:474)
    at org.hibernate.mapping.SingleTableSubclass.validate(SingleTableSubclass.java:65)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1362)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:860)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:779)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1479)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
    ... 54 more

First of all, CATEGORY_CODE is the discriminator... but it should be able to be writable. Hopefully you guys will be able to help me out once more.

Edit: this is my schema

Schema

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

巴黎盛开的樱花 2025-01-11 07:38:21

如果您需要映射鉴别器列,请使用 insert="false" update="false" 进行映射。 Hibernate认为它声明了一次,并且不可写——它只能由hibernate管理。另外,加入该专栏有点奇怪。

If you need to map the discriminator column, map it with insert="false" update="false". Hibernate considers it declared once, and it is not writable - it can only be managed by hibernate. Also, it's a bit odd to join on that column.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文