打开 JPA - @TableGenerator 带有用于辅助 table 的复合主键

Open JPA - @TableGenerator with composite primary key for auxiliary table

我有下面的实体,它使用 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
}

下面是 AUX_TABLE 的 table 结构,用于获取 id 值

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 中指定它们以及它们在 @TableGenerator.

pkColumnValue 属性中的各自值

我尝试了 pkColumnName = "DOMAIN,KEY_NAME" 但失败并出现以下异常

Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: ORA-00904: "DOMAIN,KEY_NAME": invalid identifier {prepstmnt 9864699 SELECT KEY_VALUE FROM AUX_TABLE WHERE "DOMAIN,KEY_NAME" = ? FOR UPDATE [params=?]} [code=904, state=42000] at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:219) at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:203) at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access0(LoggingConnectionDecorator.java:59) at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeQuery(LoggingConnectionDecorator.java:1118)

@TableGeneratorjava docs 没有提到这个特殊情况。

我正在使用 Open JPA 2.3.0JDK 1.7.0_45

你不能。 TableGenerator 有一个简单的 key/value 结构。