如何使具有共享对象的有序列一个抽象的JPA实体?(How do I make an abstract

2019-10-30 01:58发布

我创建JPA实体存储有关客户的信息。 我有一个客户叫抽象类。 它有两个叫消费者和用户的子类。 无论购物者和用户都在我创建了一个称为元数据存储另一个类的键值对的形式对他们的元数据。 我的问题是,我该如何有序列的元数据通过抽象类客户的增加? 下面是一些代码,所以你可以看到我在说什么:

@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列,一切都很好。 问题是,当我添加了购物的实体,现在的元数据表试图插入两个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))

如果我补充一点,实现客户第三个孩子上课,语句试图插入三个metaData_ORDER列。 很显然我没有正确地做这个抽象,我缺少什么?

Answer 1:

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

如果你的情况,你也许可以重复使用相同的顺序列,因为相同的元数据不应该有一个以上的所有者。 这似乎是在的EclipseLink的TABLE_PER_CLASS支持一个bug,尝试最新发布/编译,如果还是失败,请记录错误,并为它投票。 您也可以尝试不同类型的产业,如加盟,TABLE_PER_CLASS通常不是一个很好的解决方案。 您还可以创建自己的表,你自己的脚本。



文章来源: How do I make an abstract JPA entity that has an ordered column in a shared object?