Java IllegalArgumentException:应为IdClass映射

Java IllegalArgumentException:应为IdClass映射,java,hibernate,jboss7.x,Java,Hibernate,Jboss7.x,在部署我的应用程序期间,出现该异常。我的应用程序中有很多类,我不知道我必须把@IdClass放在哪里,这个异常意味着什么。 我正在使用Hibernate4.1和JBoss作为7.1 12:10:23,761 INFO [org.hibernate.engine.jdbc.internal.LobCreatorBuilder] (MSC service thread 1-5) HHH000424: Disabling contextual LOB creation as createClob()

在部署我的应用程序期间,出现该异常。我的应用程序中有很多类,我不知道我必须把
@IdClass
放在哪里,这个异常意味着什么。 我正在使用Hibernate4.1和JBoss作为7.1

12:10:23,761 INFO  [org.hibernate.engine.jdbc.internal.LobCreatorBuilder] (MSC service thread 1-5) HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
12:10:24,075 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] (MSC service thread 1-5) HHH000389: Unsuccessful: drop sequence hibernate_sequence
12:10:24,076 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] (MSC service thread 1-5) ERROR: sequence "hibernate_sequence" does not exist
12:10:24,281 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-5) MSC00001: Failed to start service jboss.persistenceunit."kladr.ear/kladr-ejb-1.0-SNAPSHOT.jar#primary": org.jboss.msc.service.StartException in service jboss.persistenceunit."kladr.ear/kladr-ejb-1.0-SNAPSHOT.jar#primary": Failed to start service
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1767) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_35]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_35]
    at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_35]
Caused by: java.lang.IllegalArgumentException: expecting IdClass mapping
    at org.hibernate.ejb.metamodel.AttributeFactory$3.resolveMember(AttributeFactory.java:878)
    at org.hibernate.ejb.metamodel.AttributeFactory$4.resolveMember(AttributeFactory.java:915)
    at org.hibernate.ejb.metamodel.AttributeFactory.determineAttributeMetadata(AttributeFactory.java:423)
    at org.hibernate.ejb.metamodel.AttributeFactory.buildAttribute(AttributeFactory.java:91)
    at org.hibernate.ejb.metamodel.MetadataContext.wrapUp(MetadataContext.java:214)
    at org.hibernate.ejb.metamodel.MetamodelImpl.buildMetamodel(MetamodelImpl.java:64)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:91)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:162)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.start(PersistenceUnitServiceImpl.java:85)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    ... 3 more
12:10:23761 INFO[org.hibernate.engine.jdbc.internal.LobCreatorBuilder](MSC服务线程1-5)HH000424:禁用上下文LOB创建为createClob()方法引发错误:java.lang.reflect.InvocationTargetException
12:10:24075错误[org.hibernate.tool.hbm2ddl.SchemaExport](MSC服务线程1-5)HH000389:不成功:删除序列hibernate\u序列
12:10:24076错误[org.hibernate.tool.hbm2ddl.SchemaExport](MSC服务线程1-5)错误:序列“hibernate_sequence”不存在
12:10:24281错误[org.jboss.msc.service.fail](msc服务线程1-5)MSC00001:无法启动服务jboss.persistenceunit。“kladr.ear/kladr-ejb-1.0-SNAPSHOT.jar#primary”:org.jboss.msc.service.StartException in service jboss.persistenceunit。“kladr.ear/kladr-ejb-1.0-SNAPSHOT.jar#primary”:无法启动服务
在org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1767)[jboss-msc-1.0.2.GA.jar:1.0.2.GA]
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)[rt.jar:1.6.035]
在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)[rt.jar:1.6.035]
在java.lang.Thread.run(Thread.java:662)[rt.jar:1.6.035]
原因:java.lang.IllegalArgumentException:应为IdClass映射
位于org.hibernate.ejb.metamodel.AttributeFactory$3.resolvember(AttributeFactory.java:878)
位于org.hibernate.ejb.metamodel.AttributeFactory$4.resolvember(AttributeFactory.java:915)
位于org.hibernate.ejb.metamodel.AttributeFactory.determinateAttributeAttribute元数据(AttributeFactory.java:423)
位于org.hibernate.ejb.metamodel.AttributeFactory.buildAttribute(AttributeFactory.java:91)
位于org.hibernate.ejb.metamodel.MetadataContext.wrapUp(MetadataContext.java:214)
位于org.hibernate.ejb.metamodel.MetamodelImpl.buildMetamodel(MetamodelImpl.java:64)
位于org.hibernate.ejb.EntityManagerFactoryImpl。(EntityManagerFactoryImpl.java:91)
位于org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
位于org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
位于org.hibernate.ejb.HibernatePersistence.createContainerEntityManager工厂(HibernatePersistence.java:73)
位于org.jboss.as.jpa.service.PersistenceUnitServiceImpl.CreateContainerEntityManager工厂(PersistenceUnitServiceImpl.java:162)
位于org.jboss.as.jpa.service.PersistenceUnitServiceImpl.start(PersistenceUnitServiceImpl.java:85)
在org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)[jboss-msc-1.0.2.GA.jar:1.0.2.GA]
在org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)[jboss-msc-1.0.2.GA.jar:1.0.2.GA]
... 3个以上

@IdClass
注释用于定义包含id的类。也就是说,这通常用于定义复合键的情况。i、 e.多个属性的键组合。 如果是这样的话,我们就是这样做的。看看下面的例子。。我们将一个类定义为
IdClass
,并使用
@Id
为这个
IdClass`定义变量Id
s

例如:

@Entity
@IdClass(AssignedRoleId.class)
public class AssignedRole
{
  @Id
  @ManyToOne
  private User userId;

  @Id
  @ManyToOne  
  private Role roleId;

  private Date dateAssigned;
}

希望这有帮助

进一步详细说明@Mukul正确答案
@IdClass
应具有以下属性:

  • 它应该实现可序列化
  • 它应该有一个接受Id的构造函数(即与
    @Id
    关联的字段)
  • 它应该覆盖
    equals
    hashCode
  • 将此类作为实体的静态内部类有时很有用,下面是一个示例:

    @Entity 
    @IdClass(AssignedRoleId.class)
    public class AssignedRole
    { 
        @Id
        @ManyToOne
        private User userId;
    
        @Id
        @ManyToOne
        private Role roleId;
    
        private Date dateAssigned;
    
        public static class AssignedRoleId implements Serializable {
    
            private User userId;
            private Role roleId;
    
            public AssignedRoleId() {}
    
            public AssignedRoleId(User userId, Role roleId) {
                this.userId = userId;
                this.roleId = roleId;
            }
    
            @Override
            public boolean equals(Object o) {
    
                if (o == this) {
                    return true;
                }
                if (!(o instanceof AssignedRole)) {
                    return false;
                }
                AssignedRole assignedRole = (AssignedRole) o;
                return Objects.equals(userId, assignedRole.getUserId()) &&
                       Objects.equals(roleId, assignedRole.getRoleId());
            }
    
            @Override
            public int hashCode() {
                return Objects.hash(userId, roleId);
            }
       }
    }
    

    您只能覆盖equals和hashcode,问题就会解决,还需要实现java.io.Serializable

    我也遇到了同样的问题。结果证明我没有正确使用Hibernate(不,不是Sherlock)。我的配置文件
    hibernate.cfg.xml
    没有包含我的实体Java类。。。对于hibernate配置,我只使用
    hibernate.cfg.xml
    文件,对于实体类,我只使用
    javax.persistence
    注释


    我只是在配置文件的底部添加了缺少的实体/类(总共4个类),并运行了测试代码,在我的案例中一切正常。我尝试了与u相同的方法,但红色标记显示在AssignedRoleId中。class@ashwinkarki我不知道为什么会这样。它是一个内部类,因此将在同一个包中。你能详细解释一下为什么会有红色标记吗。建议删除所有注释并设置一个基本的内部类。如果ID是string和int而不是bean,这也适用吗?@user666我认为它应该适用于所有需要复合键的类。在我的例子中,我创建了一个包含两个string和int变量的bean。如果使用
    @EmbeddedId
    @Id
    一起