gpt4 book ai didi

hibernate - 声明的元模型属性工作正常,但继承的元模型属性为 NULL。为什么?

转载 作者:行者123 更新时间:2023-12-03 12:34:53 26 4
gpt4 key购买 nike

我无法运行以下测试:-

@Test
public void test() {
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Project> query = builder.createQuery(Project.class);

Root<Project> project = query.from(Project.class);

Path<String> name = project.get(Project_.name);
Assert.assertNotNull(name);

Path<EntityLifeCycleImpl> lifeCycle = project.get(Project_.lifeCycle); // problem is here, throws NullPointer
Assert.assertNotNull(lifeCycle);
}

它在 project.get(Project_.lifeCycle) 处抛出 NullPointerException线。为什么?
java.lang.NullPointerException
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)

PersistenceEntityBase.java
import org.hibernate.annotations.GenericGenerator;
@MappedSuperclass
@Access(AccessType.PROPERTY)
public abstract class PersistentEntityBase {

protected String identifier;

protected EntityLifeCycleImpl lifeCycle = new EntityLifeCycleImpl();

protected PersistentEntityBase() {
}

@Id
@GeneratedValue(generator="generator")
@GenericGenerator(name="generator", strategy="guid", parameters = {})
@Column(name="identifier")
public String getIdentifier() {
return identifier;
}

public void setIdentifier(String identifier) {
this.identifier = identifier;
}

@Embedded
public EntityLifeCycleImpl getLifeCycle() {
return lifeCycle;
}
public void setLifeCycle(EntityLifeCycleImpl lifeCycle) {
this.lifeCycle = lifeCycle;
}

}

项目.java
@Entity
@Table(name="project")
@Access(AccessType.PROPERTY)
public class Project extends PersistentEntityBase {

private String name;

protected Project() {
}

public Project(String name) {
this();
this.name = name;
}

@Column(name="name", nullable=false, unique=true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}

EntityLifeCycleImpl.java
@Embeddable
public class EntityLifeCycleImpl implements EntityLifeCycle {
private String createdBy;
private Date createdDate;
@Column(name="created_by")
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {

this.createdBy = createdBy;
}

@Column(name="created_date")
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}

}

PersistentEntityBase_.java (使用 Hibernate Metamodel Generator 生成)
   @StaticMetamodel(PersistentEntityBase.class)
public abstract class PersistentEntityBase_ {
public static volatile SingularAttribute<PersistentEntityBase, EntityLifeCycleImpl> lifeCycle;
public static volatile SingularAttribute<PersistentEntityBase, String> identifier;
}

项目_.java
    @StaticMetamodel(Project.class)
public abstract class Project_ extends PersistentEntityBase_ {
public static volatile SingularAttribute<Project, String> name;
}

EntityLifeCycleImpl_.java
   @StaticMetamodel(EntityLifeCycleImpl.class)
public abstract class EntityLifeCycleImpl_ {
public static volatile SingularAttribute<EntityLifeCycleImpl, String> createdBy;
public static volatile SingularAttribute<EntityLifeCycleImpl, Date> createdDate;
}

持久性.xml (仅相关部分)
<class>com.comp.timetracking.entity.PersistentEntityBase</class>
<class>com.comp.timetracking.entity.Project</class>

编辑:
我使用 hibernate-entitymanager.3.6.0.Final 和 hibernate-jpamodelgen.1.0.0.Final。

编辑 2
@帕斯卡
我认为 Hibernate EM 3.6.0.Final 允许我们定义 @Embedded注释字段位于 @Entity级别,但它在 @MappedSuperclass 拒绝此类字段等级。你怎么说?

由于我在这里看不到“文件上传选项”,我已经在我的 esnips 帐户中上传了 TestCase。 Download基于 maven 的项目并运行 SingularAttributeTest.java .并检查控制台输出
ERROR main metamodel.MetadataContext:413 - Unable to locate static metamodel field : timetracking.entity.Employee_#lifeCycle

点击“ 下载内嵌奇异属性.zip ”链接下载文件,无需安装下载管理器。 (如果你点击 Download link with Green arrow ,你必须安装下载管理器!!)

最佳答案

我使用 EclipseLink 测试了您的类和测试用例(我删除了 Hibernate 特定部分)并且测试通过了。但它确实在 Hibernate 3.5.6 上失败了。看起来像 Hibernate 中的一个错误。

顺便说一下,您缺少一个 Temporal您的 Embeddable 中的注释

@Column(name = "created_date")
@Temporal(TemporalType.DATE)
public Date getCreatedDate() {
return createdDate;
}

而且你不应该声明 PersistentEntityBasepersistence.xml (映射的父类(super class)不是实体)。

关于hibernate - 声明的元模型属性工作正常,但继承的元模型属性为 NULL。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4077075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com