java - Hibernate 字节码增强单向 ManyToOne

标签 java hibernate maven byte-code-enhancement

我正在尝试向基于 Java 的 Hibernate 应用程序添加字节码增强功能。 Hibernate 的版本是 5.2.6.Final,它是在 maven 中构建的,所以我使用 hibernate-enhance-maven-plugin.我已经测试了以下问题直至5.2.18.Final,但结果是相同的。

“enableAssociationManagement”选项给我带来了几个问题,并且应用程序无法增强。我的问题是我有几个单向 ManyToOne 映射,我只需要从子类访问父类。我永远不需要从父实体引用子实体。

我的典型映射如下所示:

public class Child implements Serializable {
    private Parent parent;
    @ManyToOne
    @JoinColumn(name="FK_PARENT", referencedColumnName="ID", nullable=true)
    public Parent getParent() { return this.parent; }
    public void setParent(Parent parent) { this.parent = parent; }
}

public class Parent implements Serializable {
    //No variable/getter/setter for a collection of the children, as they are not needed here.
}

所有这些映射在增强过程中都会失败,给出以下错误:

INFO: Enhancing [com.mycom.model.Child] as Entity
Aug 08, 2019 3:31:09 PM org.hibernate.bytecode.enhance.internal.javassist.PersistentAttributesEnhancer handleBiDirectionalAssociation
INFO: Could not find bi-directional association for field [com.mycom.model.Child#parent]

我理解这个错误。我在父级中没有相应的 @OneToMany 注释。我已经确认这确实有效:

public class Child implements Serializable {
    private Parent parent;
    @ManyToOne
    @JoinColumn(name="FK_PARENT", referencedColumnName="ID", nullable=true)
    public Parent getParent() { return this.parent; }
    public void setParent(Parent parent) { this.parent = parent; }
}

public class Parent implements Serializable {
    private Set<Child> children;
    @OneToMany(mappedBy="parent")
    public Set<Child>getChildren() { return this.children; }
    public void setChildren(Set<Child>parent) { this.children = children; }
}

但如前所述,我不想要一个。我目前的理解是 more efficient to only have a unidirectional @ManyToOne mapping (只是@ManyToOne)。但是,也许我错了,因为这个错误即将出现?

是否有更好的方法来注释我的两个模型实体?或者我是否缺少一个注释/选项来向字节码增强表明多对一关系完全是单向的,而不是双向的?

最佳答案

这只是一个信息级别的警告。

enableAssociationManagement 确定“是否应增强双向关联管理”。由于它是单向的,因此无需做任何工作。

当指定failOnError 时,这不会停止您的构建。

如果您查看 PersistentAttributesEnhancer 的源代码 PersistentAttributesEnhancer可以看到,当没有指定mappedBy时,会记录这个info级别的日志。

如果您的构建因您的failOnError 设置而失败,则很可能存在不同的问题。错误消息的描述性不是很强,看起来信息消息就是问题所在。我必须在 IllegalStateException 上放置异常断点才能确定真正的问题。

关于java - Hibernate 字节码增强单向 ManyToOne,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57421320/

相关文章:

mysql - Hibernate SQL QUERY,mysql 中的 TEXT 数据类型问题

java - 具有相同 id 的一对一映射

java - 构建项目gradle时出现错误: Connection timed out: connect ?

java - 如何生成随机数?

java - 使用 springboot 创建具有 null 属性的对象的 Json 到 POJO

java - 在某些 Windows 服务或程序启动时触发 Java 程序

java - 如何将泛型类传递给 Java 中的方法?

java - joda-time 和 Hibernate - 日期不存储在 UTC 中

java - 如何使用 maven jgit 构建号插件打印构建时间戳和构建号?

java - Maven项目:FileNotFoundException error when creating a Jar file