【问题标题】:How do I make an abstract JPA entity that has an ordered column in a shared object?如何制作在共享对象中具有有序列的抽象 JPA 实体?
【发布时间】:2013-08-13 17:05:09
【问题描述】:

我正在创建 JPA 实体来存储有关客户的信息。我有一个名为客户的抽象类。它有两个子类,称为购物者和用户。购物者和用户都以键值对的形式拥有关于他们的元数据,我创建了另一个名为 MetaData 的类来存储这些元数据。我的问题是,如何通过客户的抽象类向元数据添加有序列?这是一些代码,因此您可以看到我在说什么:

@Inheritance( strategy = TABLE_PER_CLASS )
public abstract class Customer implements Serializable
{

@OneToMany( mappedBy = "parent", orphanRemoval = false  )
@OrderColumn //THIS IS CAUSING AN ERROR, BUT I WANT AN ORDERED COLUMN - PLEASE HELP
private List<MetaDataType> metaData;
}

用户和购物者类本质上是相同的,这里没什么特别的 -

@Entity
public class User extends Customer implements Serializable
{
  ...some user specific stuff
}

这里是元数据类-

@Entity
public class MetaData implements Serializable
{

@EmbeddedId
protected MetaDataId id;

@ManyToOne
@JoinColumn( name = "parentGuid", referencedColumnName = "guid", insertable = false,  updatable = false   )
protected Customer parent;
 .... 
}

如果我只有一个子类说用户,这可以正常工作,并且元数据表有一个名为 metaData_order 的列,一切都很好。问题是当我添加 Shopper 实体时,现在 metaData 表尝试插入两个 MetaData_order 列并抛出此异常 -

java.sql.SQLSyntaxErrorException: Column name 'METADATA_ORDER' appears more than once in the CREATE TABLE statement.

Call: CREATE TABLE METADATA (VALUE VARCHAR(255), parentGuid VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL, metaData_ORDER INTEGER, metaData_ORDER INTEGER, PRIMARY
KEY (parentGuid, name))

如果我添加实现 Customer 的第三个子类,该语句会尝试插入三个 metaData_ORDER 列。显然我没有正确地做这个抽象,我错过了什么?

【问题讨论】:

    标签: java jpa annotations abstract


    【解决方案1】:

    如果目标对象是共享的,则需要使用@JoinTable 来存储关系和OrderColumn。

    如果您的情况,您可能会重复使用相同的订单列,因为相同的元数据不应拥有多个所有者。这似乎是 EclipseLink 的 TABLE_PER_CLASS 支持中的错误,请尝试最新版本/构建,如果仍然失败,请记录错误并投票。您也可以尝试不同类型的继承,例如 JOINED,TABLE_PER_CLASS 通常不是一个好的解决方案。您也可以使用自己的脚本自己创建表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 2017-02-07
      • 1970-01-01
      • 2010-12-23
      • 2014-10-31
      • 2023-03-14
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多