java – JPA(Hibernate):在泛型@MappedSuperclass中使用@EmbeddedId时出错
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JPA(Hibernate):在泛型@MappedSuperclass中使用@EmbeddedId时出错,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2197字,纯文字阅读大概需要4分钟。
内容图文
![java – JPA(Hibernate):在泛型@MappedSuperclass中使用@EmbeddedId时出错](/upload/InfoBanner/zyjiaocheng/768/9dde783ccbb84bb2b22028c638e09f69.jpg)
我目前正在为遗留数据库定义JPA实体(许多复合键,但也包括单列键).我创建了以下实体超类:
@MappedSuperclass
public abstract class AbstractEntity<ID extends Serializable> {
public abstract ID getId();
public abstract void setId(ID id);
}
然后是复合键的超类(以及长主键的超类,此处未列出):
@MappedSuperclass
public abstract class AbstractEmbeddedIdEntity<ID extends Serializable> extends AbstractEntity<ID> {
@EmbeddedId
private ID id;
public AbstractEmbeddedIdEntity() {
id = newId();
}
@Override
public ID getId() {
return id;
}
@Override
public void setId(ID id) {
this.id = id;
}
protected abstract ID newId();
}
最后这样的具体实体:
@Entity
@Table(name = "firstEntity")
public class FirstEntity extends AbstractEmbeddedIdEntity<FirstEntityId> {
public FirstEntity() {
}
@Embeddable
public static class FirstEntityId implements Serializable {
@Column(name = "firstId")
private String firstId;
public FirstEntityId() {
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof FirstEntityId)) {
return false;
}
FirstEntityId other = (FirstEntityId) obj;
return
Objects.equals(firstId, other.firstId);
}
@Override
public int hashCode() {
return Objects.hash(firstId);
}
}
@Override
protected FirstEntityId newId() {
return new FirstEntityId();
}
}
现在的问题是,如果我有这样的多个实体并尝试访问实体的ID属性(当前使用Spring Boot,例如findByIdFirstId(String firstId)),则抛出异常:
java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [firstId] on this ManagedType [unknown]
我调试了这个并发现在hibernate中,元模型将我的所有实体映射到相同的MappedSupperclass实例.在应用程序启动期间,newId()返回的@EmbeddedId设置为MappedSupperclass,覆盖前一个实体的ID.所以最后,所有实体都映射到相同的MappedSupperclass,但MappedSupperclass只有最后一个实体的@EmbeddedId.
在上面的示例中,访问ID属性失败,因为最后一个实体的@EmbeddedId没有名为“firstId”的属性(它已被最后一个实体的ID属性覆盖).
现在我想知道我的方法是否错误,如果我遗漏了什么或者这可能是hibernate的问题?
使用spring boot available on github的完整示例.使用mvn spring-boot:run运行.
解决方法:
这看起来像是一个hibernate中的bug,因此我在hibernate bug tracker中创建了一个票证.
作为一种解决方法,我现在在concreate实体类中定义ID属性(@EmbeddedId)而不是抽象超类.
内容总结
以上是互联网集市为您收集整理的java – JPA(Hibernate):在泛型@MappedSuperclass中使用@EmbeddedId时出错全部内容,希望文章能够帮你解决java – JPA(Hibernate):在泛型@MappedSuperclass中使用@EmbeddedId时出错所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。