在经历了一些令人沮丧的问题和测试之后,我了解到 hibernate 不能懒惰地获取 ToOne 关系。
从我读过的内容来看,hibernate 通过将自己的 Set 设置为代理来延迟获取 ToMany,并且当在该 Set 上调用方法时,它会在执行操作之前获取数据库中的数据。美好的。
对于 ToOne,我看到的原因是,由于属性可以为 null(与 ToMany 不同),hibernate 必须知道它是否需要使用 null 或代理填充它,并且 hibernate 在不查询另一个表的情况下无法知道这一点。由于它必须查询其他表,因此它同时急切地获取数据。
我觉得这很愚蠢。我可以在关系的非拥有方理解它,表中没有任何内容指示是否填充了 toOne,但在拥有方,表包含一个带有外键的列,该列要么为空,要么不为空。
为什么不能休眠查询表并根据该列的值将属性设置为 null 或代理?它不需要检查第二个表,如果你的列不为空,你就知道第二个表有一个相应的条目(如果没有,你有完整性问题,hibernate 应该抛出)。
假设我有一个带有泛型参数的方法:
public <U> void genericMethod(U param) {
// doStuff
}
Run Code Online (Sandbox Code Playgroud)
我也有两个类,其中一个扩展了另一个类:
public class A {}
public class B extends A {}
Run Code Online (Sandbox Code Playgroud)
我这样做:
A var = new B();
genericMethod(var);
Run Code Online (Sandbox Code Playgroud)
在genericMethod,什么是类型U?
我传递的变量genericMethod被声明为A,但实际上是B,所以是U类型A还是B?
我试过测试它,但我找不到U在运行时获取信息的方法。
我在 java 项目上使用 Hazelcast,但我只使用单个节点并且不需要任何集群。当多个开发实例相互发现并形成集群时,这实际上会给我们带来问题。
有没有办法在 xml 配置中完全禁用集群?
编辑:我正在使用 Hazelcast 3.8.4,我尝试像这样禁用多播,但看起来它仍然处于启用状态:
<hz:hazelcast id="hazelcast">
<hz:config>
<hz:group name="dev" password="password"/>
<hz:properties>
<hz:property name="hazelcast.logging.type">slf4j</hz:property>
</hz:properties>
<hz:network port="5701" port-auto-increment="true">
<hz:join>
<hz:multicast enabled="false"/>
</hz:join>
</hz:network>
<hz:topic name="topicStuff"/>
</hz:config>
</hz:hazelcast>
Run Code Online (Sandbox Code Playgroud)
日志:
12:54:51,273 INFO [com.hazelcast.hibernate.HazelcastLocalCacheRegionFactory] - Starting up HazelcastLocalCacheRegionFactory
12:54:51,284 INFO [com.hazelcast.config.XmlConfigLocator] - Loading 'hazelcast-default.xml' from classpath.
12:54:51,398 INFO [com.hazelcast.instance.DefaultAddressPicker] - [LOCAL] [dev] [3.8.4] Prefer IPv4 stack is true.
12:54:51,409 INFO [com.hazelcast.instance.DefaultAddressPicker] - [LOCAL] [dev] [3.8.4] Picked [10.212.134.200]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
12:54:51,426 INFO [com.hazelcast.system] …Run Code Online (Sandbox Code Playgroud)