【发布时间】:2015-05-26 05:19:54
【问题描述】:
我有下面的实体,它使用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用来获取id值的表结构
DOMAIN varchar2(4) NOT NULL,
KEY_NAME varchar2(100) NOT NULL,
KEY_VALUE 十进制(2) NOT NULL,
CONSTRAINT AUX_TABLE_PK 主键(域,KEY_NAME)
因为AUX_TABLE 具有复合主键,由DOMAIN 和KEY_NAME 组成;我无法弄清楚如何在pkColumnName 中指定它们以及它们在@TableGenerator 的pkColumnValue 属性中的各自值。
我尝试了pkColumnName = "DOMAIN,KEY_NAME",但由于以下异常而失败了
原因:org.apache.openjpa.lib.jdbc.ReportingSQLException: ORA-00904: "DOMAIN,KEY_NAME": 无效标识符 {prepstmnt 9864699 SELECT KEY_VALUE 从 AUX_TABLE WHERE "DOMAIN,KEY_NAME" = ? 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
【问题讨论】:
-
在给定的表结构中,没有看到您尝试用作主键的任何列名。确定您是否定义了具有适当名称的列。
-
@ViswanathD 我现在已经在问题中添加了主键(它已经存在于我的数据库中)