【问题标题】:Inherited abstract class with JPA + Circular reference使用 JPA + 循环引用继承抽象类
【发布时间】:2015-12-18 20:58:33
【问题描述】:

我有一个包含两个字段的抽象类 AbstractEntity:

  • lastEditTime (LocalDateTime)
  • lastEditUser (UserEntity)

下面是代码:

@MappedSuperclass
public abstract class AbstractEntity {

    protected LocalDateTime lastEditTime;

    protected UserEntity lastEditUser;

    protected AbstractEntity () { }

    protected AbstractEntity (UserEntity creatorUser) {
        lastEditTime = LocalDateTime.now();
        lastEditUser = creatorUser;
    }

    public LocalDateTime getLastEditTime() {
        return lastEditTime;
    }

    public void setLastEditTime(LocalDateTime lastEditTime) {
        this.lastEditTime = lastEditTime;
    }

    public UserEntity getLastEditUser() {
        return lastEditUser;
    }

    public void setLastEditUser(UserEntity lastEditUser) {
        this.lastEditUser = lastEditUser;
    }
}

然后我有一个包含许多不同字段的 UserEntity 类:

@Entity
@Table(name = "Users")
public class UserEntity extends AbstractEntity {

    @Id
    private String name;

    private String password;

    ...

}

Eclipse 显示以下错误消息:

在隐含关联覆盖“lastEditUser”中,无法在表“users”上解析连接列“lastEditUser_name”

这是什么意思?我该如何解决?

谢谢!

【问题讨论】:

  • 抽象映射超类引用子类(在您的构造函数中)是不寻常的。这应该只是抽象类吧?
  • 我的意图是只有一个表(“用户”),其中包含一个包含用户主键外键的列。该列必须允许空值。我如何用 JPA 来表示它?我的第一种方法是使用 id 而不是对象(字符串而不是 UserEntity).. 但是文献说我应该引用对象,而不是 ID。我说的对吗?
  • 该消息告诉您用户表中没有 lastEditUser_name 列。这是应该包含最后编辑用户实体实例的用户的外键的列。
  • 如果我更改“受保护的 UserEntity lastEditUser;”通过“受保护的字符串 lastEditUser;”我收到相同的错误消息。所以,问题不在于循环引用。
  • JB 尼泽特。我应该手动创建表中的列吗?我认为 JPA 会这样做。

标签: java eclipse jpa inherited


【解决方案1】:

我断开了 Eclipse 数据源。然后我清理了项目(错误消息消失了),然后我删除了数据库中的表,最后我运行了一个测试用例来重新创建表。

新表有两个继承的列。

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2011-05-15
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多