Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 从具有自动递增主键的实体生成表_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

Hibernate 从具有自动递增主键的实体生成表

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

在我们的应用程序中,我们从JPA实体生成数据库表。我需要创建一个实体来生成一个具有自动递增主键的表。随后,我需要能够在Hibernate之外不存在PK的情况下执行普通SQL插入

例如,在应用程序日志中插入值“logtime”、“logpackage”、“logclass”、“method”、“message”

我已经尝试了一些策略,比如GenerationType.IDENTITY、AUTO、TABLE,但是当我调用上面的insert语句时,它们都不起作用

@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呢?