2

我正在从将 id 映射到列的实用程序基类扩展

@MappedSuperclass
public abstract class BaseDTO
{
     @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int id;
    public int getId() {
        return id;}

    public void setId(int id) {
        this.id = id;}
}

此类用于许多派生类,以提供对包含 id 列的表的简化访问和操作。IE

BaseDTO->DBAbstractClass1->DBAbstract2->MyClassDTO
BaseDTO->DBAbstractClass1->DBAbstract3->AnotherADTO
BaseDTO->DBAbstractClass2->DBAbstract4->AnotherBDTO

等等

现在我发现我有一个映射到 MyClassDTO 的表,它没有“id”列(它有一个名为“标识符”的列),但由于架构限制,按正常原因扩展:

[org.hibernate.util.JDBCExceptionReporter] SQL Error: 1054, SQLState: 42S22
[org.hibernate.util.JDBCExceptionReporter] Unknown column 'this_.id' in 'field list'

我尝试将 id 成员覆盖为@Transient,添加一个新的@Id 等,但总是得到上面的错误。

要么我找到一种“忽略”或替换继承 id 的方法,要么我需要复制我继承的类而不扩展 BaseDTO,这是一个好的程序员应该避免的事情。

我在 Hibernate 看到过类似的东西:How override an attribute from mapped super class 但我不确定它是否能解决我的确切问题。

这可能是一个简单的覆盖,但要小心没有副作用。有接盘侠吗?

4

2 回答 2

1

我没有找到简单优雅的解决方案。

我所做的是反转层次结构以创建两个 HelperDTO 类,一个扩展另一个类,第二个包含 id 属性。HelperDTO 没有 Id 成员,而 HelperWithIdDTO 有一个 Id 成员,即

HelperDTO->MyClassDTO (classes that do not use id)

HelperDTO->HelperWithIdDTO->OtherDTO (classes that use id)
于 2012-05-08T13:28:59.123 回答
0

尝试在您的子类中覆盖对 super 的这些更改?

@MappedSuperclass
public abstract class BaseDTO
{

    public int id;
    public int getId() {
        return id;}

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public void setId(int id) {
        this.id = id;}
}
于 2012-05-03T16:09:58.327 回答