Tag: jpa 2.1

如何在JPA中混合inheritance类型

如何在同一inheritance树中混合单表类型inheritance和连接表类型? 我没有使用hibernate只是JPA。 我知道通过阅读JPA规范,没有官方支持混合inheritance。 我无法改变架构。 它确实与hibernate一起工作但现在我需要使用openjpa来实现它。 我正在寻找一些解决方法。

JPA 2.1 ConstructorResult导致ClassCastException

我的结果集中的对象被强制转换为’Object’而不是我在@SQLResultSetMapping对象中指定的对象。 我正在尝试获取ConstructorResult的句柄,并创建了一个包含简单连接的查询,并尝试获取结果集并循环,但它将其打印出来以确保我正确。 然而,当我进入循环时,看起来应该是直截了当的不是。 当我声明结果列表时,它被转换为类型。 我逐步执行查询测试类,它成功运行查询并将其加载到结果中,但结果列表中的项目已键入“Object”而不是CommentInfoListItemDTO对象。 因此,当我进入循环时,它会遇到类强制转换exception。 为什么不将结果强制转换为CommentInfoListItemDTO对象? 特别是在@SQLResultSetMapping中具体说明。 代码发布在下面…我截断了一些列名称只是为了缩短它们。 如果它有助于将其添加回来让我知道。 public List getCommentTitleListByPersonId(BigInteger personId) { String queryString = “select c.article_id, ” ***[columns removed for brevity]*** + “c.person_id as comment_person_id, ” + “a.party_id as aticle_party_id ” + “from article_comment c ” + “join article a ” + “on a.article_id = c.article_id ” + “where c.person_id = […]

Spring引导Hibernate错误java.lang.NoSuchMethodError:javax.persistence.JoinColumn.foreignKey()Ljavax / persistence / ForeignKey;

我正在使用Spring Boot在具有许多Hibernate依赖项的现有项目上做原型。 我试图定义一个自定义LocalEntityManagerFactoryBean,它在这里我得到这个错误: java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey; 我已经尝试更新我的hibernate版本(由于项目向后兼容性导致许多其他编译错误,无法使用所有最新版本)但是使用以下hibernate依赖图可以使其编译但仍然得到此运行时依赖性错误。 当我搜索此错误时,所有结果都指向Hibernate 4和JPA 2.1的升级。 我们已经在使用Hibernate 4+,所以只是将版本更高一点但没有运气。 Gradle的以下依赖图显示我没有任何旧版本的“org.hibernate.javax.persistence:hibernate-jpa-2.0-api” | +— org.hibernate:hibernate-entitymanager:4.3.7.Final | | +— org.hibernate:hibernate-core:4.3.7.Final | | | +— org.hibernate.common:hibernate-commons-annotations:4.0.5.Final | | | +— org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final | | +— org.hibernate.common:hibernate-commons-annotations:4.0.5.Final (*) | | +— org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final | +— org.hibernate:hibernate-validator:5.1.3.Final | | | +— org.hibernate:ejb3-persistence:1.0.2.GA | | | | | +— org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final | | […]

JPA 2.1:Java 8日期/时间API简介

我想在我的JPA应用程序中添加对Java 8 Date / Time API(JSR-310)的支持。 很明显, JPA 2.1 不支持Java 8 Date / Time API 。 作为一种解决方法,最常见的建议是使用AttributeConverter 。 在我现有的应用程序中,我将实体更改为使用LocalDate / LocalDateTime类型作为列映射字段,并为它们添加了java.util.Date旧setter / getter。 我创建了相应的AttributeConverter类。 将Query.setParameter()与java.util.Date实例一起使用时, 我的应用程序现在失败了 (它在转换到新API之前工作)。 似乎JPA期望新的日期类型并且不会动态转换它。 我希望如果将一个参数传递给已注册AttributeConverter的类型的setParameter() ,它将由转换器自动转换。 但似乎并非如此,至少不使用EclipseLink 2.6.2 : java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.Date for parameter closeDate with expected type of class java.time.LocalDate from […]

JPA:如何自动生成影子表(历史记录)

我正在使用EclipseLink的历史记录function 。 据我所知,目前还没有实际创建影子表的支持 。 我正在为所有基表使用JPA 2.1自动化模式生成。 工作良好。 现在我正在寻找一种自动化创建影子表的方法。 对于每个基表,应该有一个带有一些额外列的影子表。 否则,影子表具有正在遮蔽的表的确切结构。 我在模型中有超过50个实体,并且在其中抛出了一些多对多关系,所有映射到大约55个物理表。 我不想为所有影子表维护DDL创建脚本。 现在该项目与数据库无关(至少对于通常的嫌疑人而言),我想保持这种方式。 绑定到EclipseLink不是问题所以EclipseLink特定的解决方案是可以的。 那么,如何创建影子表呢? 可以使用子类来表示每个历史表。 假设基类是Car ,那么: @Entity @Table(name=”CAR_HIST”) public class ClassHist extends Car { … // some extra audit fields here } 并且在Car上使用@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)注释它实际上将使用JPA模式生成来完成工作。 所以,几乎就是这样。 除了没有实体的多对多关系表,我可以得到实际操作,因此无法获得为关系表生成的影子表。 UPDATE 原来使用inheritance来创建影子表并不是一个好主意。 原因是JPA JPQL查询是多态的 。 这意味着像SELECT a FROM Car这样的查询实际上也会进入CAR_HIST表,因为CarHist只是Car一个子类。 从这些表中获取SELECT的UNION。 显然不想要我想要。 它不是一个好主意的另一个原因是用于历史的子类将inheritance其父级的主键。 这也是完全错误的。 更新2 我发现EclipseLink中有这个function的RFE 。

JPA 2.1 Hibernate中的NamedSubgraph忽略嵌套子图

我正在使用Hibernate 4.3.8.FINAL并且具有以下模型,其中Department有许多Employees,Employee可以是Manager。 经理有一套Foo,可以是Foo或Bar。 员工实体: @Entity @Table(name = “employee”, schema = “payroll”) @Inheritance(strategy = InheritanceType.JOINED) public class Employee { @Id private Long id; @Basic(optional = false) @Column(name = “name”) private String name; @JoinColumn(name = “department_id”, referencedColumnName = “id”) @ManyToOne(optional = false, fetch = FetchType.LAZY) private Department department; } 经理实体: @Entity @Table(name = “manager”, schema = “payroll”) […]

使用EclipseLink在JPA 2.1中注册转换器

在JavaEE环境中,我使用EclipseLink的JPA 2.1实现, 我有一些包含enums实体。 所以我为这些枚举创建了转换器。 汽车实体: @Entity public class Car implements Serializable { private static final long serialVersionUID = 6L; @Id private String id; @Convert (converter = CarColorConverter.class) private CarColor color; public enum CarColor { Black, Gray, White, Red }; public Car () { id = GenerateUUID.id (); } …. } CarColor转换器: @Converter (converterClass = CarColorConverter.class, […]

从JPA 2.1带注释的实体类自动生成数据模式,无需数据库连接

两年前,我正在使用以下项目开展项目: spring4.0.3.RELEASE jpa 2.0 hibernate 4.2.7.Final java 1.6.X 这个项目有一个maven任务hibernate3-maven-plugin,它允许我们在没有任何数据库连接(MySQL)的情况下生成数据库模式。 现在我们正在升级这个项目: java 1.8 jpa 2.1 spring4.2.4.RELEASE hibernate 5.0.6.Final 据我所知,hibernate3-maven-plugin在JPA 2.1和hibernate> 4.3上不起作用。 我发现的所有解决方案都需要连接到数据库。 例如: 从JPA带注释的实体类中自动生成数据模式 。 有谁知道如何离线生成数据库模式? 我所拥有的是一个persistence.xml,列出了所有的Entity类。

实体表未使用JPA 2.1创建

我在Netbeans中使用JPA 2.1来创建我的实体。 如果我的数据库没有表,那么它应该从实体创建表。 当我部署并运行我的企业应用程序时,userEntity表不会出现在我的mySQL数据库中。 有什么帮助吗? 🙂 以下是我的代码。 persistence.xml中 jdbc/commonInfraDatasource false userEntity.java package entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class userEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long systemUserId; private String userName; private String password; private String email; private int activateStatus; private String accessGroup; private int lockOutStatus; […]

加载spring-boot和spring-data-jpa时,Hibernate无法加载JPA 2.1 Converter

我有一个UUID的自定义转换器将其转换为字符串而不是二进制文件: package de.kaiserpfalzEdv.commons.jee.db; import javax.persistence.AttributeConverter; import javax.persistence.Converter; import java.util.UUID; @Converter(autoApply = true) public class UUIDJPAConverter implements AttributeConverter { @Override public String convertToDatabaseColumn(UUID attribute) { return attribute.toString(); } @Override public UUID convertToEntityAttribute(String dbData) { return UUID.fromString(dbData); } } 转换器(我有一些其他特别用于时间/日期处理的)驻留在库.jar文件中。 然后我在.jar文件中有实体。 像这个: package de.kaiserpfalzEdv.office.core.security; import de.kaiserpfalzEdv.commons.jee.db.OffsetDateTimeJPAConverter; import de.kaiserpfalzEdv.commons.jee.db.UUIDJPAConverter; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import […]