Maria DB - запрос на обновление JPA / Hibernate вызывает исключение из-за неправильной генерации запроса - PullRequest
0 голосов
/ 10 апреля 2019

Я работал над созданием инструмента для загрузки / обновления данных в Maria DB с использованием Spring Boot и JPA / Hibernate.Я хочу загрузить данные в таблицу с составными первичными ключами.Ниже я попробовал

Класс встроенного первичного ключа, он состоит из двух первичных ключей, ключа и языка

@Embeddable
public class MessageResourcePK implements Serializable {
/**
 *
 */
private static final long serialVersionUID = -4226351093015653675L;

private String language;
private String key;

public MessageResourcePK() {}

public MessageResourcePK(String language, String key) {
    super();
    this.language = language;
    this.key = key;
}

/**
 * @return the language
 */
@Column(name = "LANGUAGE")
public String getLanguage() {
    return this.language;
}

/**
 * @param language the language to set
 */
public void setLanguage(String language) {
    this.language = language;
}

/**
 * @return the key
 */
@Column(name = "KEY")
public String getKey() {
    return this.key;
}

/**
 * @param key the key to set
 */
 public void setKey(String key) {
    this.key = key;
 }

 @Override
 public boolean equals(Object obj) {
    boolean resultat = false;

    if (obj == this) {
        resultat = true;
    } else {
        if (!(obj instanceof MessageResourcePK)) {
            resultat = false;
        } else {
            MessageResourcePK autre = (MessageResourcePK) obj;
            if (!this.language.equals(autre.language)) {
                resultat = false;
            } else {
                if (!this.key.equals(autre.key)) {
                    resultat = false;
                } else {
                    resultat = true;
                }
            }
        }
    }
    return resultat;
 }

 @Override
 public int hashCode() {
    return (this.language + this.key).hashCode();
 }

Фактический класс таблицы

 @Entity
 @Table(name = "MESSAGE_RESOURCE")
 @IdClass(MessageResourcePK.class)
 public class MessageResourceTable implements 
 Comparable<MessageResourceTable> {
 /**
 *
 */
 private static final long serialVersionUID = -4226351093015653675L;

 private String language;
 private String key;
 private String message;

 /**
 * @return the language
 */
 @Id
 @Column(name = "LANGUAGE")
 public String getLanguage() {
    return this.language;
 }

 /**
  * @param language the language to set
 */
 public void setLanguage(String language) {
    this.language = language;
 }

 /**
 * @return the key
 */
 @Id
 @Column(name = "KEY")
 public String getKey() {
    return this.key;
 }

/**
 * @param key the key to set
 */
 public void setKey(String key) {
    this.key = key;
 }

/**
 * @return the message
 */
 @Column(name = "MESSAGE")
 public String getMessage() {
    return this.message;
 }

/**
 * @param message the message to set
 */
 public void setMessage(String message) {
    this.message = message;
 }

 @Override
 public int compareTo(final MessageResourceTable o) {
    return this.language.compareTo(o.getLanguage()) + 
 this.key.compareTo(o.getKey());
 }

Репозиторий JPA для этого

@Repository("MessageResourceService")
@Transactional
public interface MessageResourceService extends 
JpaRepository<MessageResourceTable, MessageResourcePK>{

}

Метод findAll работает нормально, но когда я пытаюсь использовать метод save, он генерируетследующий запрос

update
    message_resource 
set
    message=? 
where
    key=? 
    and language=?

Но в Maria DB это не будет выполнено, я попытался локально с помощью следующего запроса, который отлично работает

update message_resource m set m.MESSAGE = 'jjjj' where m.`KEY`='someKey' and 
m.`LANGUAGE`='someLanguage'

Поскольку сгенерированный запрос неправильный, он выбрасывает SQLGrammarException , поскольку перед ключом должно быть что-то вроде m.key , есть ли какое-то решение для этого.Пожалуйста, не отмечайте это как дубликат, потому что я искал через stackoverflow, и никто не получил такой же случай, как я.

Файл application.properties

## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = 


## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen 
database
spring.jpa.properties.hibernate.dialect = 
 org.hibernate.dialect.MariaDBDialect

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = validate

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.properties.hibernate.current_session_context_class
=org.springframework.orm.hibernate5.SpringSessionContext


spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
...