0

我正在创建 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 列。显然我没有正确地做这个抽象,我错过了什么?

4

1 回答 1

0

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

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

于 2013-08-14T15:08:13.137 回答