Как вставить сущность с помощью Hibernate в Amazon Redshift - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь сделать вставку в таблицу, используя Hibernate.Проблема в том, что Redshift не принимает последовательности, а вместо этого принимает создание IDENTITY для строки.

У меня есть следующий сценарий:

Структура моей таблицы:

CREATE TABLE rsds_ops_latam.log( idlog BIGINT PRIMARY KEY IDENTITY(0,1), idaccount varchar(255), username varchar(255), oldowner varchar(255), newowner varchar(255), oldclass varchar(255), newclass varchar(255), date timestamp DEFAULT GETDATE() );

Моя сущность:

@Entity
@NamedQuery(name="Log.findAll", query="SELECT l FROM Log l")
@Table(name = "log")
public class Log implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "idlog")
private long idLog;

private String userName;

@Temporal(TemporalType.TIMESTAMP)
@GeneratedValue()
@Column(name = "date")
private Date date;

@Column(name = "idaccount")
private String idAccount;

@Column(name = "oldowner")
private String oldOwner;

@Column(name = "newowner")
private String newOwner;

@Column(name = "oldclass")
private String oldClass;

@Column(name = "newclass")
private String newClass;

И в журнале появляется следующее, когда я пытаюсь сохранить сущность:

11:38:16,702 INFO  [stdout] (default task-3) Hibernate: 
11:38:16,702 INFO  [stdout] (default task-3)     insert 
11:38:16,702 INFO  [stdout] (default task-3)     into
11:38:16,702 INFO  [stdout] (default task-3)         rsds_ops_latam.log
11:38:16,702 INFO  [stdout] (default task-3)         (date, idaccount, newclass, newowner, oldclass, oldowner, userName) 
11:38:16,702 INFO  [stdout] (default task-3)     values
11:38:16,703 INFO  [stdout] (default task-3)         (?, ?, ?, ?, ?, ?, ?)
11:38:18,340 INFO  [stdout] (default task-3) Hibernate: 
11:38:18,346 INFO  [stdout] (default task-3)     select
11:38:18,347 INFO  [stdout] (default task-3)         currval('rsds_ops_latam.log_idlog_seq')
11:38:18,876 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-3) SQL Error: 500310, SQLState: 42P01
11:38:18,878 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-3) [Amazon](500310) Invalid operation: relation "rsds_ops_latam.log_idlog_seq" does not exist;

И моя persistence.xml как следует:

<persistence-unit name="accounts2" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <jta-data-source>java:/AccountMovementsRS</jta-data-source>
     <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL9Dialect" />
        <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
        <property name="hibernate.default_schema" value="rsds_ops_latam"/>
        <property name="hibernate.connection.url" value="myconnection" />
        <property name="hibernate.connection.username" value="user" />
        <property name="hibernate.connection.password" value="password" />
         <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
        <property name="hibernate.flushMode" value="FLUSH_AUTO" />
        <property name="hibernate.hbm2ddl.auto" value="validate" />
     </properties>
</persistence-unit>

Есть какие-то идеи в том, что я могу сделать?

Спасибо!

1 Ответ

0 голосов
/ 28 октября 2018

Redshift основан на на Postgres, но в нем отсутствуют многие функции Postgres.Одним из них являются последовательности.Вы можете попробовать аннотировать ваш столбец idlog с помощью [GenerationType.TABLE] (https://docs.oracle.com/javaee/7/api/javax/persistence/GenerationType.html#TABLE). После этого Hibernate должен создать таблицу, которая будет использоваться аналогично последовательности, и сделать это в plain sql(совместимо с Redshift).

Обратите внимание: , при таком подходе снижается производительность, поскольку hibernate блокирует таблицу последовательности для каждой вставки, что может оказаться дорогостоящим.

Я также поддерживаю мнение @ Джона о том, что Redshift не предназначен для одиночных вставок (поэтому отсутствуют функции).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...