Hibernate 从具有自动递增主键的实体生成表
在我们的应用程序中,我们从JPA实体生成数据库表。我需要创建一个实体来生成一个具有自动递增主键的表。随后,我需要能够在Hibernate之外不存在PK的情况下执行普通SQL插入 例如,在应用程序日志中插入值“logtime”、“logpackage”、“logclass”、“method”、“message” 我已经尝试了一些策略,比如GenerationType.IDENTITY、AUTO、TABLE,但是当我调用上面的insert语句时,它们都不起作用Hibernate 从具有自动递增主键的实体生成表,hibernate,jpa,jpa-2.0,Hibernate,Jpa,Jpa 2.0,在我们的应用程序中,我们从JPA实体生成数据库表。我需要创建一个实体来生成一个具有自动递增主键的表。随后,我需要能够在Hibernate之外不存在PK的情况下执行普通SQL插入 例如,在应用程序日志中插入值“logtime”、“logpackage”、“logclass”、“method”、“message” 我已经尝试了一些策略,比如GenerationType.IDENTITY、AUTO、TABLE,但是当我调用上面的insert语句时,它们都不起作用 @Entity public clas
@Entity
public class ApplicationLog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="logtime")
private String datetime;
@Column(name="logpackage")
private String _package;
@Column(name="logclass")
private String _class;
private String method;
private String message;
...
}
我将得到以下错误:
ERROR: invalid input syntax for integer: "asdf"
LINE 1: INSERT INTO ApplicationLog VALUES ('asdf', 'ee' ,'cc','33', ...
我的应用程序必须支持SQLServer2012+、Postgres9+和Oracle11g+,因此应用程序需要尽可能保持与数据库无关
作为一点背景信息,我的设置只是为了允许使用Log4j的JDBCAppender,这样我就可以登录数据库并使用Hibernate读取应用程序中的记录进行显示。请注意Oracle不支持自动增量字段。你必须使用序列和触发器来实现这样的功能。因此,它与GenerationType.IDENTITY断开。我想我可以为Oracle做一些特殊处理,但GenerationType.IDENTITY似乎应该与Postgres和SqlServer一起工作,但事实并非如此。数据库有自己的PKs生成结构。正如dic19所提到的,对于Oracle,您需要使用序列,因此在实体中必须指定GenerationType.Sequence。为什么不改用CreateNativeQuery呢?