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>
我正在尝试将三个 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++;
}
}
}
你肯定是用错了
public class Player {
private int[] 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>