有没有办法使用JPA映射不可变的Value对象(例如电子邮件地址)?
@Immutable @Embeddable public final class EmailAddress { private final String value; public EmailAddress(String value) { this.value = value; } public String getValue() { return value; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; EmailAddress that = (EmailAddress) o; return value.equals(that.value); } @Override public int hashCode() { return value.hashCode(); } }
现在我在实体保存上出现异常
org.hibernate.InstantiationException: No default constructor for entity: com.domain.EmailAddress org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:107) org.hibernate.tuple.component.AbstractComponentTuplizer.instantiate(AbstractComponentTuplizer.java:102) org.hibernate.type.ComponentType.instantiate(ComponentType.java:515) org.hibernate.type.ComponentType.deepCopy(ComponentType.java:434) org.hibernate.type.TypeHelper.deepCopy(TypeHelper.java:68) org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:302) org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69) org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179) org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135) org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61) org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808) org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782) org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786) org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:672) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) $Proxy25.persist(Unknown Source) org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:360) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:368) org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:349) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) $Proxy26.save(Unknown Source) com.controller.UserController.create(UserController.java:64)
我想使用final字段并将其hibernate为JPA实现。
您将无法使用标准JPA注释和可嵌入对象来执行此操作,因为必须使用默认构造函数创建该对象,并且必须通过反射来设置该值。
但是,您可以使用Hibernate自定义类型。阅读Hibernate参考文档的这一部分,那里有一个示例Money类型,该类型使用带有参数的构造函数实例化,因此可能是不可变的。
Money