Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Java 在JPA getters中使用.clone()时会产生奇怪的副作用(.clone()因SonarQube问题而使用)_Java_Jpa_Sonarqube - Fatal编程技术网

Java 在JPA getters中使用.clone()时会产生奇怪的副作用(.clone()因SonarQube问题而使用)

Java 在JPA getters中使用.clone()时会产生奇怪的副作用(.clone()因SonarQube问题而使用),java,jpa,sonarqube,Java,Jpa,Sonarqube,我有一个我不明白的顽固问题 我有一个Jpa持久性类,每个列都有getter和setter——一切正常——除了:SonarQube在这里是一个主要问题 public Timestamp getKey() { return this.key; } 规则恶意代码漏洞-可能通过返回对可变对象的引用而暴露内部表示-解释建议添加.clone()(并且强制转换是必要的)。所以我得到了 public Timestamp getKey() { return (Timestamp) this.key.cl

我有一个我不明白的顽固问题

我有一个Jpa持久性类,每个列都有getter和setter——一切正常——除了:SonarQube在这里是一个主要问题

public Timestamp getKey()
{
  return this.key;
}
规则恶意代码漏洞-可能通过返回对可变对象的引用而暴露内部表示-解释建议添加
.clone()
(并且强制转换是必要的)。所以我得到了

public Timestamp getKey()
{
  return (Timestamp) this.key.clone();
}
但是现在,持久性不再起作用了-当我尝试创建一个新的
DataJpa
,然后创建
entityManager.persist(DataJpa)
,我得到以下错误消息:

通信错误:发生一般错误:java.lang.ClassNotFoundException:org.apache.openjpa.util.java$sql$Timestamp$proxy 在com.appclient.container.startup.ClientContainerEJBFactory.createEJBException(ClientContainerEJBFactory.java:27)

我不知道为什么使用
.clone()
会产生这样的副作用。为什么当我使用
.clone()
和转换为
时间戳时,我会得到这个
ClassNotFoundException
,但当我
返回这个.key时,我却没有得到它直接

另一个问题:如何更改getter,使SonarQube不会抱怨

有什么想法吗?谢谢

编辑:我只会在
时间戳
上得到这种奇怪的副作用,而不是在
日期


编辑2:注释中建议使用
新时间戳(this.key.getTime())起作用并消除SonarQube问题。与调用
.clone()

相比,不确定性能。该值似乎是延迟加载的,因此它使用了一个代理类,在您看来,该类与同一个类相似,但在内部却不同,它的名称不同。@coladict但是为什么在创建和保存值时使用getter,为什么只有在我使用
.clone()
??@outofmind时才会使用getter?你真的需要盲目地遵守吗?毕竟这只是一个程序。此外,它看起来像是误报。这是一个
java.sql.Timestamp
,对吗?尝试
返回新的时间戳(key.getTime())在该getter中。另一个解决方案是,如果您可以让OpenJPA使用字段访问,而不是属性,这样它就不会使用getter/setter。但是,每次返回新的将阻止从缓存中进行任何提取,因为这是您的关键。@Kayaman如果客户不希望出现新的重大问题,我必须给出充分的理由或完成它。getter只是给你一个对象的引用,所以之后在同一个对象上有两个引用,并且都可以更新它。如果我返回一个克隆,则不会发生这种情况。该值似乎是延迟加载的,因此它使用的代理类在您看来像同一个类,但在内部它不是,并且它的名称不同。@coladict但是为什么在创建和保存值时使用getter,为什么只有在我使用
.clone()时才会发生这种情况
??@outofmind你真的需要盲从吗?毕竟这只是一个程序。此外,它看起来像是误报。这是一个
java.sql.Timestamp
,对吗?尝试
返回新的时间戳(key.getTime())在该getter中。另一个解决方案是,如果您可以让OpenJPA使用字段访问,而不是属性,这样它就不会使用getter/setter。但是,每次返回新的将阻止从缓存中进行任何提取,因为这是您的关键。@Kayaman如果客户不希望出现新的重大问题,我必须给出充分的理由或完成它。getter只是给你一个对象的引用,所以之后在同一个对象上有两个引用,并且都可以更新它。如果我返回一个克隆人,就不会发生这种情况。