打开JPA - @TableGenerator,其中包含辅助表的复合主键

时间:2015-03-23 09:10:25

标签: java oracle jpa openjpa

我有下面的实体,它使用TABLE策略来生成id,并且工作得很好。

@Entity
@Table(name = "Test_Table")
public class SomeEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @TableGenerator(name = "TABLE_GEN", table = "AUX_TABLE", pkColumnName = "KEY_NAME", valueColumnName = "KEY_VALUE", pkColumnValue = "someValue", allocationSize = 10)
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
    @Column(unique = true, nullable = false, precision = 20)
    private long someId;

    // few other properties and getter / setter
}

以下是用于获取id值的AUX_TABLE的表结构

  

DOMAIN varchar2(4)NOT NULL,      
KEY_NAME varchar2(100)NOT NULL,      
KEY_VALUE decimal(2)NOT NULL,      
CONSTRAINT AUX_TABLE_PK PRIMARY KEY(DOMAIN,KEY_NAME)

由于AUX_TABLE复合主键包含DOMAINKEY_NAME;我无法确定如何在pkColumnName中指定它们以及它们在pkColumnValue的{​​{1}}属性中的相应值。

我尝试了@TableGenerator,但失败了以下异常

  

引起:org.apache.openjpa.lib.jdbc.ReportingSQLException:ORA-00904:“DOMAIN,KEY_NAME”:标识符无效    {prepstmnt 9864699从AUX_TABLE WHERE“DOMAIN,KEY_NAME”中选择KEY_VALUE =? FOR UPDATE [params =?]} [code = 904,state = 42000]       在org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:219)       在org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:203)       在org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access $ 700(LoggingConnectionDecorator.java:59)       在org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator $ LoggingConnection $ LoggingPreparedStatement.executeQuery(LoggingConnectionDecorator.java:1118)

pkColumnName = "DOMAIN,KEY_NAME"的{​​{3}}没有提及此特定情况。

我正在使用 Open JPA 2.3.0 JDK 1.7.0_45

1 个答案:

答案 0 :(得分:2)

你做不到。 TableGenerator具有简单的键/值结构。