Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaHibernate:不同的属性集函数行为取决于调用它的人_Hibernate - Fatal编程技术网

JavaHibernate:不同的属性集函数行为取决于调用它的人

JavaHibernate:不同的属性集函数行为取决于调用它的人,hibernate,Hibernate,假设我为Hibernate处理的类中的给定属性定义了一组get和set函数。set函数是一个公共函数,可以由Hibernate的机制以及正常的代码流调用 如果set函数是由Hibernate调用的,它应该只设置字段的值。如果集合被另一个源调用,它还应该相应地更新其他字段 代码中是否有方法区分这两种情况?或者,有没有更好的方法来处理这种情况?Hibernate不会这么做。这是属于代码的业务逻辑,而不是Hibernate。这是一个ORM解决方案,它只做一件事:持久化对象。它试图让你忘记有一个关系数据

假设我为Hibernate处理的类中的给定属性定义了一组get和set函数。set函数是一个公共函数,可以由Hibernate的机制以及正常的代码流调用

如果set函数是由Hibernate调用的,它应该只设置字段的值。如果集合被另一个源调用,它还应该相应地更新其他字段


代码中是否有方法区分这两种情况?或者,有没有更好的方法来处理这种情况?

Hibernate不会这么做。这是属于代码的业务逻辑,而不是Hibernate。这是一个ORM解决方案,它只做一件事:持久化对象。它试图让你忘记有一个关系数据库在后面做这项工作


您所说的是基于源代码的业务逻辑,以及您可能想到但尚未表达的其他内容。只有你能写。将其放在实现用例的服务中。如果它是一个跨领域的问题,请将其放在一个方面。

处理它的最简单方法是将Hibernate配置为直接访问字段,而不是通过方法。在这种情况下,您可以在getter和setter中实现任何类型的逻辑,而Hibernate不会触发它

如果使用基于注释的方法,可以通过在字段上放置注释来配置此行为


如果您必须使用属性访问器,您可以创建两个由同一字段支持的属性-一个用于Hibernate(它可以是非公共的),另一个用于其他代码(它应该被注释为
@Transient
,以使Hibernate忽略它)。

我不确定我是否理解。这个逻辑不应该在set函数中实现吗?应该在代码的某个地方实现。Hibernate只是实现的一部分。我把这个逻辑放在持久性类之外。如果我们需要使用属性访问器怎么办?重要的是要知道,应该避免将字段和属性访问与注释混合使用,因为Hibernate会从Id或EmbeddedId的位置猜测访问类型。