Hibernate Annotations如何覆盖/忽略继承的id成员

时间:2012-05-03 15:51:44

标签: hibernate annotations override ignore inherited

我正在从将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列的表提供简化的访问和操作。 即。

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

现在我发现我有一个映射到MyClassDTO的表,它没有'id'列(它有一个名为'identifier'的列),但由于架构限制,按正常原因执行:

[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 但我不确定它能解决我的确切问题。

这可能是一个简单的覆盖,但要小心,没有副作用。 任何人?

2 个答案:

答案 0 :(得分:1)

我发现没有简单优雅的解决方案。

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

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

HelperDTO->HelperWithIdDTO->OtherDTO (classes that use id)

答案 1 :(得分: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;}
}