如何在 Gemfire 区域中创建复合主键场景?
How to create composite primary key scenario in Gemfire region?
我正在将大型机迁移到 java。我在 DB2 中有一个 table。我正在将此 table 复制为 Gemfire 中的一个区域。在执行此操作时,我有 table 的复合主键。将 table 复制到 gemfire 区域。我想为区域创建复合主键。我只想知道,是否有可能在区域中创建复合主键?
理想情况下,您创建的键值在 Key/Value 对 "put" 进入区域后不会改变。 GemFire/Geode 区域只是 java.util.Map
的美化版本(准确地说是 HashMap)。
这意味着 "composite" 键不应基于区域值本身中的任何 属性 值。举例来说,假设我有一个值 Customer
定义如下...
class Customer {
Long accountNumber;
Gender gender;
LocalDate birthDate;
String firstName;
String lastName;
...
}
然后像这样创建一个密钥是不可取的...
class CustomerKey {
LocalDate birthDate;
String firstName;
String lastName;
}
虽然一个人的出生日期、名字和姓氏通常足以唯一地识别一个人,但如果这些个人 property/field 值中的任何一个发生变化,那么鉴于 [=59= 的内在行为,您将失去配对] Map
(所以要小心)
您还应该注意精心制作您创建的任何 "custom/composite" 键 class 的 equals/hashCode
方法。
我通常建议您使用内部(仅应用程序知道)标量类型作为密钥,例如Long
或 String
.
这就像在 Customer
class 中添加一个 property/field 一样简单...
class Customer {
Long id;
...
}
大多数时候,您的 (OQL) 查询谓词基于单个域对象 properties/fields 的值,而不是键。例如...
SELECT c FROM /Customers c WHERE c.lastName = 'Doe'
此外,如果您的密钥是 String
,您可以使用 UUID class 生成唯一值。否则,您将需要制定自己独特的密钥生成策略。
总而言之,虽然在 Java 中精心设计了 class 类型,但您的要求是可能的,通常不推荐这样做;更喜欢简单的标量类型。
这里有一个 link 要记住的一般事项。
希望这对您有所帮助。
-约翰
我正在将大型机迁移到 java。我在 DB2 中有一个 table。我正在将此 table 复制为 Gemfire 中的一个区域。在执行此操作时,我有 table 的复合主键。将 table 复制到 gemfire 区域。我想为区域创建复合主键。我只想知道,是否有可能在区域中创建复合主键?
理想情况下,您创建的键值在 Key/Value 对 "put" 进入区域后不会改变。 GemFire/Geode 区域只是 java.util.Map
的美化版本(准确地说是 HashMap)。
这意味着 "composite" 键不应基于区域值本身中的任何 属性 值。举例来说,假设我有一个值 Customer
定义如下...
class Customer {
Long accountNumber;
Gender gender;
LocalDate birthDate;
String firstName;
String lastName;
...
}
然后像这样创建一个密钥是不可取的...
class CustomerKey {
LocalDate birthDate;
String firstName;
String lastName;
}
虽然一个人的出生日期、名字和姓氏通常足以唯一地识别一个人,但如果这些个人 property/field 值中的任何一个发生变化,那么鉴于 [=59= 的内在行为,您将失去配对] Map
(所以要小心)
您还应该注意精心制作您创建的任何 "custom/composite" 键 class 的 equals/hashCode
方法。
我通常建议您使用内部(仅应用程序知道)标量类型作为密钥,例如Long
或 String
.
这就像在 Customer
class 中添加一个 property/field 一样简单...
class Customer {
Long id;
...
}
大多数时候,您的 (OQL) 查询谓词基于单个域对象 properties/fields 的值,而不是键。例如...
SELECT c FROM /Customers c WHERE c.lastName = 'Doe'
此外,如果您的密钥是 String
,您可以使用 UUID class 生成唯一值。否则,您将需要制定自己独特的密钥生成策略。
总而言之,虽然在 Java 中精心设计了 class 类型,但您的要求是可能的,通常不推荐这样做;更喜欢简单的标量类型。
这里有一个 link 要记住的一般事项。
希望这对您有所帮助。
-约翰