IllegalArgumentException: ожидается отображение IdClass
Во время развертывания моего приложения я сталкиваюсь с этим исключением. У меня много приложений в моем приложении, и я не знаю, где я должен разместить @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
5 ответов
@IdClass
аннотация используется для определения класса, который содержит идентификатор. т.е. это обычно используется в случае определения составного ключа. т. е. ключевой состав из более чем одного атрибута. Если это так, то как мы это делаем. взгляните на следующий пример.. мы определяем класс как IdClass
и использовать @Id
для определения различных идентификаторовs for this
IdClass`.
Пример:
@Entity
@IdClass(AssignedRoleId.class)
public class AssignedRole
{
@Id
@ManyToOne
private User userId;
@Id
@ManyToOne
private Role roleId;
private Date dateAssigned;
}
Надеюсь это поможет.
Продолжая разрабатывать @Mukul правильный ответ @IdClass
должен иметь следующие свойства:
- Это должно реализовать Serializable
- Он должен иметь конструктор, который принимает идентификаторы (то есть поля, связанные с
@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);
}
}
}
Вы можете перезаписать только равенства и хэш-код, и проблема будет решена, а также необходимо реализовать java.io.Serializable
Я столкнулся с этой ошибкой, когда расширялся из другого объекта и также использовал @EmbeddedId. Он брал @Id от родительского объекта. Таким образом, наличие @Id и @EmbeddedId в одной иерархии сущностей вызывало это для меня. В моем случае сообщение об ошибке было немного вводящим в заблуждение. Я избавился от ошибки, не расширившись от родителя.
Это не применимо к вашему случаю, так как вы не расширяетесь, но я пишу этот ответ для людей, получающих эту ошибку из-за проблемы, которая отличается от того, что указано в сообщении об ошибке.
У меня такая же проблема. Оказывается, я неправильно использовал Hibernate (черт возьми, Шерлок). Мой файл конфигурации не включал мои классы Entity Java ... Я использую только файл для конфигурации гибернации и только
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>