我正在使用hibernate插入一个mysql表,其中所有列都定义为非null.它具有唯一的主键和多个列上的另一个唯一索引.
我收到以下错误:
org.springframework.dao.DataIntegrityViolationException:无法执行JDBC批量更新; SQL [插入MY_TABLE(col1,col2,col3,col4,ID_)值(?,?,?,?,?)]; 约束[null]
此错误在客户日志中,我无法自己重现问题,因此我无法进行调试以查看insert语句中的值.
我的理解是"约束[null]"意味着违反了"非空"约束.但是,看看我的代码,我看不到任何可能的方式,插入时任何数据都可能为null,除非hibernate试图插入一个空ID(这在hibernate中是一个非常糟糕的错误,所以似乎不太可能).
但是,我可以看到如何违反唯一约束.该消息是否可能具有误导性,我实际上是在获得唯一的密钥违规?"constraint [null]"是否始终意味着违反了非空约束?
我为使这段代码工作而必须做的事感到困惑.似乎编译器优化了我需要的类型转换,或者在这里我还有其他一些我不理解的东西.
我有各种对象存储在实现接口的数据库中Foo.我有一个对象,bar它保存我用来检索我的Foo对象的数据.bar有这些方法:
Class getFooClass()
Long getFooId()
Run Code Online (Sandbox Code Playgroud)
我将类和ID传递给具有此签名的方法,该方法委托给hibernate,后者根据其类和ID检索主题:
public <T> T get(Class<T> clazz, Serializable id);
Run Code Online (Sandbox Code Playgroud)
有不同的实现者Foo,其中一些hibernate对象有Longid,而其他有Integerid.虽然这种方法接受了,但更远的地方最好接受正确的方法.因此,当我尝试调用get()带有Integerid 的对象时,如下所示,我可以理解地抱怨我提供了Long一个Integer需要的位置:
get(bar.getFooClass(), bar.getFooId());
Run Code Online (Sandbox Code Playgroud)
这里有没有休眠的问题,我只需要提供一个Integer地方的Integer需要ID和Long其中一个Long是必需的ID.所以我添加了一个方法bar,hasLongId()和试过这:(在这一点上,你可能会想,这不是一个很好的设计,但现在这不是我的问题)
get(bar.getFooClass(),
bar.hasLongId() ? bar.getFooId() : bar.getFooId().intValue());
Run Code Online (Sandbox Code Playgroud)
它仍然抱怨我提供了一个Long.这看起来很奇怪.然后我尝试了这个:
get(bar.getFooClass(),
bar.hasLongId() ? bar.getFooId()
: new Integer(bar.getFooId().intValue()));
Run Code Online (Sandbox Code Playgroud)
同样的错误!怎么会这样?所以我介入调试器,是的,它逐步完成intValue()并通过Integer构造函数,但是在get方法中,传递的参数实际上是一个Long- Long从返回的同一个对象getFooId(). …
更新:我已经了解了更多有关正在发生的事情并在底部添加了新信息。
我有 2 个应用程序在 tomcat 下运行。首先加载 App1,然后加载 App2。如果 App1 在启动过程中遇到任何类型的错误并且无法成功加载,我会在 App2 启动过程中收到此错误:
Caused by: java.security.NoSuchAlgorithmException: No such algorithm: RSA/NONE/OAEPWithSHA1AndMGF1Padding
at javax.crypto.Cipher.getInstance(DashoA13*..)
at javax.crypto.Cipher.getInstance(DashoA13*..)
at com.jp.protection.security.BouncyCastleSecurityProvider.getCipher(BouncyCastleSecurityProvider.java:139)
at com.jp.protection.security.BouncyCastleSecurityProvider.decode(BouncyCastleSecurityProvider.java:110)
... 70 more
Caused by: java.lang.NullPointerException
at org.bouncycastle.jcajce.provider.util.DigestFactory.getDigest(DigestFactory.java:86)
at org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.initFromSpec(CipherSpi.java:83)
at org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineSetPadding(CipherSpi.java:214)
at javax.crypto.Cipher$r.a(DashoA13*..)
... 74 more
Run Code Online (Sandbox Code Playgroud)
请注意,最终原因是 NullPointerException。我下载了 DigestFactory 的源代码,它看起来像这样(只是摘录了相关部分):
package org.bouncycastle.jcajce.provider.util;
public class DigestFactory
{
private static Set sha1 = new HashSet();
static
{
sha1.add("SHA1");
sha1.add("SHA-1");
}
public static Digest getDigest(
String digestName)
{
digestName = Strings.toUpperCase(digestName);
if (sha1.contains(digestName)) ** line …Run Code Online (Sandbox Code Playgroud)