我下面有一个实体,该实体使用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十进制(2)NOT NULL,
CONSTRAINT AUX_TABLE_PK主键(DOMAIN,KEY_NAME)
由于
AUX_TABLE
具有由DOMAIN
和KEY_NAME
组成的复合主键;我无法弄清楚如何在pkColumnName
中指定它们,并在pkColumnValue
属性的@TableGenerator
属性中指定它们各自的值。我尝试了
pkColumnName = "DOMAIN,KEY_NAME"
,但由于以下异常而失败引起原因:org.apache.openjpa.lib.jdbc.ReportingSQLException:ORA-00904:“ DOMAIN,KEY_NAME”:无效的标识符
{prepstmnt 9864699从AUX_TABLE中的“ 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)
@TableGenerator
的java docs对此特殊情况没有提及。我正在将Open JPA 2.3.0与JDK 1.7.0_45一起使用
最佳答案
你不能。 TableGenerator具有简单的键/值结构。