簡體   English   中英

IllegalArgumentException:需要 IdClass 映射

[英]IllegalArgumentException: expecting IdClass mapping

在部署我的應用程序期間,我遇到了那個異常。 我的應用程序中有很多類,我不知道必須在哪里放置@IdClass以及這個異常到底意味着什么。 我正在使用 Hibernate 4.1 和 JBoss AS 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

@IdClass注解用於定義包含id的Class。 即這通常用於定義復合鍵的情況。 即多個屬性的關鍵組合。 如果是這樣,那我們就是這樣做的。 看看下面的例子.. 我們定義一個類作為IdClass並使用@Id s for this

例子:

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

  @Id
  @ManyToOne  
  private Role roleId;

  private Date dateAssigned;
}

希望這可以幫助。

進一步闡述@Mukul 的正確答案, @IdClass應該具有以下屬性:

  1. 它應該實現可序列化
  2. 它應該有一個采用 id 的構造函數(即與@Id關聯的字段)
  3. 它應該覆蓋equalshashCode

有時將此類作為實體的靜態內部類很有用,下面是一個示例:

@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(沒有 Sh.t Sherlock)。 我的配置文件hibernate.cfg.xml不包括我的實體 Java 類...我只使用hibernate.cfg.xml文件進行休眠配置,並且只為我的實體類使用javax.persistence注釋。

我剛剛在我的配置文件底部添加了缺少的實體/類(總共 4 個類)並運行了我的測試代碼,一切正常。

新的hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
    <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
    <property name="connection.username">foo</property>
    <property name="connection.password">bar</property>
    <mapping class="test.entities.MixEntity"/>
    <mapping class="test.entities.ZutatEntity"/>
    <mapping class="test.entities.RezeptEntity"/>
    <mapping class="test.entities.MixEntityPK"/>
  </session-factory>
</hibernate-configuration>

當我從另一個實體擴展並且還使用 @EmbeddedId 時,我遇到了這個錯誤。 它從父實體中獲取@Id。 因此,在同一個實體層次結構中使用@Id 和@EmbeddedId 對我來說是造成這種情況的原因。 在我的案例中,錯誤消息有點誤導。 我通過不從父級擴展來擺脫錯誤。

這不適用於您的情況,因為您沒有擴展,但我寫這個答案是為了讓人們因為與錯誤消息中提到的問題不同的問題而收到此錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM