java - компонент карты Hibernate с несколькими массивами - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь отобразить три столбца таблицы в трех примитивных массивах. Но что бы я ни пытался, я не могу заставить это работать. Вот код:

class Parent {
    private Component component;
}

class Component {
    private Parent parent;
    private int[] valuesOne;
    private int[] valuesTwo;
    private double[] valuesThree;
}

Отображение гибернации:

<class name="com.package.Parent" table="parent">
    <id name="id" column="id" access="field" type="int">
        <generator class="increment"/>
    </id>
    ...
    <component name="component" access="field">
        <many-to-one name="parent" class="com.package.Parent" insert="false" update="false" fetch="join" column="id" access="field"/>
        <primitive-array name="valuesOne" table="component" access="field">
            <key column="parent_id"/>
            <index column="index"/>
            <element column="value_one" type="int"/>
        </primitive-array>
        <primitive-array name="valuesTwo" table="component" access="field">
            <key column="parent_id"/>
            <index column="index"/>
            <element column="value_two" type="int"/>
        </primitive-array>
        <primitive-array name="valuesThree" table="component" access="field">
            <key column="parent_id"/>
            <index column="index"/>
            <element column="value_three" type="double"/>
        </primitive-array>
    </component>
</class>

Таблица базы данных:

CREATE TABLE parent (
    id              INTEGER NOT NULL AUTO_INCREMENT,
    ...
)


CREATE TABLE component (
    id              INTEGER NOT NULL AUTO_INCREMENT,
    parent_id       INTEGER NOT NULL,
    index           INTEGER NOT NULL,
    value_one       INTEGER NOT NULL,
    value_two       INTEGER NOT NULL,
    value_three     DECIMAL NOT NULL
)

Теперь эта половина работает. Hibernate создаст для каждого значения отдельный запрос, например:

Hibernate: 
    insert 
    into
        component
        (parent_id, index, value_one) 
    values
        (?, ?, ?)

То, что я на самом деле хочу, это:

Hibernate: 
    insert 
    into
        component
        (parent_id, index, value_one, value_two, value_three) 
    values
        (?, ?, ?, ?, ?)

Как мне добиться этого с помощью сопоставления Hibernate?

Ответы [ 3 ]

0 голосов
/ 05 апреля 2020

Вы определенно используете неправильно Предположим, у вас есть объект с именем Player с iformNumbers в качестве свойства. И вы определили свойство iformNumbers как массив int. Для того, чтобы использовать правильно, вам нужно определить таблицу для сущности Player и ассоциативную таблицу для Uniform .

public class Player {
    private int[] uniformNumbers;
}

A Элемент в вашем отображении позволяет вам сопоставить массив примитивов со связанной таблицей в базе данных. Экземпляры игрока хранятся в одной таблице, а связанный массив примитивов, в данном случае iformNumbers , хранится в другой таблице. Каждый примитив в массиве получает свою собственную строку в связанной таблице Uniform . Каждая строка идентифицируется примитивным значением и идентификатором объекта-владельца, в данном случае Идентификатор игрока . Однако, когда Player получен из базы данных, вся коллекция строк из Uniform , которые связаны с Player (по идентификатору), используется для получения массив целых для свойства iformNumbers .

<class name="Player" table="player">
    <id name="id" column="id">
        <generator class="increment"/>
    </id>
    ...
    <primitive-array name="uniformNumbers" table="uniform">
        <key column="player_id"/>
        <index column="order"/>
        <element column="uniform_number" type="int"/>
    </primitive-array>
</class>

Другими словами, вам нужно определить три связанные таблицы. Один для каждого примитивного массива.

0 голосов
/ 14 апреля 2020

Очевидно, я задумался над этим, мне просто нужно было создать один массив с несколькими полями.

class Component {
    private Parent parent;
    private ComponentEntry[] entries;
}

class ComponentEntry {
    private int id;
    private Component parent;
    private int valueOne;
    private int valueTwo;
    private double valueThree;
}

Затем просто сопоставить массив.

<array name="entries" table="component" cascade="all-delete-orphan" access="field">
    <key column="parent_id" not-null="true"/>
    <index column="index" type="int"/>
    <one-to-many class="ComponentEntry"/>
</array>
0 голосов
/ 01 апреля 2020

Попробуйте это решение: для реализации массовых и пакетных вставок необходимо настроить размер пакета в application.properties:

spring.jpa.properties.hibernate.jdbc.batch_size=5
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true

Затем необходимо создать объект (модель) для таблицы компонентов

@Entity
@Table(name="Component")
public class Component {
@Id
private String id;

@Column(name="value_one")
private int value_one;

@Column(name="value_two")
private int value_two;

@Column(name="value_three")
private double value_three;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public int getValue_one() {
    return value_one;
}

public void setValue_one(int value_one) {
    this.value_one = value_one;
}

public int getValue_two() {
    return value_two;
}

public void setValue_two(int value_two) {
    this.value_two = value_two;
}

public double getValue_three() {
    return value_three;
}

public void setValue_three(double value_three) {
    this.value_three = value_three;
}

}

Интерфейс репозитория с базой данных определен ниже:

@Repository
public interface ComponentRepository  
    extends JpaRepository<Component, Integer> {
}

Бизнес логи c реализован в классе обслуживания:

@Service
 public class ComponentService {
@Resource
private ComponentRepository compRepository;

@Transactional // this annotaion is
// important for transaction management in the database
public void saveComponents(List<Component> components) {
    int size = components.size();
    int counter = 0;
    List<Component> temp = new ArrayList<>();
    for (Component emp : components) {
        temp.add(emp);
        if ((counter + 1) % 100 == 0
                || (counter + 1) == size) {
            compRepository.saveAll(temp);
            temp.clear();
        }
        counter++;

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