java - 具有多个数组的 Hibernate 地图组件

java - Hibernate map component with multiple arrays

我正在尝试将三个 table 列映射到三个原始数组中。但无论我尝试什么,我都无法让它发挥作用。 这是代码:

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>

数据库table:

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 映射实现此目的?

试试这个解决方案: 为了实现批量和批量插入,需要在 application.properties:

中配置批量大小
spring.jpa.properties.hibernate.jdbc.batch_size=5
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true

然后需要为组件创建一个实体(模型)table

@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> {
}

业务逻辑在服务中实现class:

@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++;

    }
}
}

你肯定是用错了。假设您有一个名为 Player 的实体,其 uniformNumbers 作为 属性。并且您已将 uniformNumbers 属性 定义为 int 数组。为了正确使用 ,您需要为 Player 实体定义一个 table 并为 [=18= 实体定义一个关联的 table ]制服.

public class Player {
    private int[] uniformNumbers;
}

映射中的 元素允许您将基元数组映射到数据库中的关联 table。 Player 实例存储在一个 table 中,而关联的基元数组,在本例中为 uniformNumbers,存储在另一个 table。数组中的每个基元在关联的 Uniformtable 中都有自己的行。每行由原始值和拥有实体的 ID 标识,在本例中为 Player's ID。但是,当从数据库中获取 Player 时,Uniform 中与 Player[ 关联的整个行集合=31=](按 ID)用于获取 uniformNumbers 属性.

的整数数组
<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>

换句话说,您必须定义三个关联的 table。每个原始数组一个。

显然是我想多了,我只需要创建一个包含多个字段的数组即可。

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>