JPA覆盖SuperClass属性

时间:2017-11-16 14:19:19

标签: java hibernate jpa

我有SuperClass,我已经定义了我的属性,我想在其中一个SuperClass属性上再应用一个注释。

@MappedSuperclass
public class CartBaseEntity {
private String cartName;

@Column(name = "cart_name")
public String getCartName() {
    return cartName;
 }

public void setCartName(String cartName) {
    this.cartName = cartName;
 }
}

我的子课程如下:

@Entity
@Table(name = "CART2")
public class CartEntity extends CartBaseEntity implements Serializable {

private Set<Items> items;

@Basic(fetch = FetchType.LAZY)
@Override
public String getCartName() {
    return super.getCartName(); 
  }
}

我试图覆盖'cartName'列,并希望在其上添加 @Basic 注释。它有可能还是有任何工作环节? TIA

1 个答案:

答案 0 :(得分:3)

是的,可以将NtAlertThread注释应用于子类:

extern "C" NTSYSCALLAPI NTSTATUS NTAPI NtAlertThread(HANDLE ThreadHandle);

VOID NTAPI OnApc(ULONG_PTR Parameter)
{
    DbgPrint("OnApc(%p)\n", Parameter);
}

DWORD CALLBACK BreakWaitThread(HANDLE hThread)
{
    switch (LONG status = MessageBoxW(0, L"Use Apc(yes) or Alert(No) ?", L"BreakWaitThread", 
        MB_ICONQUESTION|MB_YESNOCANCEL|MB_DEFBUTTON3))
    {
    case IDYES:
        if (!QueueUserAPC(OnApc, hThread, 0))
        {
            DbgPrint("QueueUserAPC=%u\n", GetLastError());
        }
        break;
    case IDNO:
        if (0 > (status = NtAlertThread(hThread)))
        {
            DbgPrint("AlertThread=%x\n", status);
        }
        break;
    case IDCANCEL:
        DbgPrint("canceled\n");
        break;
    default:
        DbgPrint("MessageBox=%x\n", status);
    }

    CloseHandle(hThread);

    return 0; 
}

void ConsoleLoop(HANDLE hStdIn)
{
    ULONG NumberOfEvents, NumberOfEventsRead, n;

    INPUT_RECORD buf[8], *p;

    for (;;)
    {
        switch (ZwWaitForSingleObject(hStdIn, TRUE, 0))
        //switch (WaitForSingleObjectEx(hStdIn, INFINITE, TRUE))
        {
        case WAIT_OBJECT_0:

            while (GetNumberOfConsoleInputEvents(hStdIn, &NumberOfEvents) && NumberOfEvents)
            {
                do 
                {
                    NumberOfEventsRead = min(RTL_NUMBER_OF(buf), NumberOfEvents);

                    if (ReadConsoleInput(hStdIn, buf, NumberOfEventsRead, &NumberOfEventsRead) && NumberOfEventsRead)
                    {
                        n = NumberOfEventsRead;
                        p = buf;
                        do 
                        {
                            if (p->EventType == KEY_EVENT)
                            {
                                DbgPrint("%u(%u) %C %x %x %x\n", 
                                    p->Event.KeyEvent.bKeyDown,
                                    p->Event.KeyEvent.wRepeatCount,
                                    p->Event.KeyEvent.uChar.UnicodeChar,
                                    p->Event.KeyEvent.wVirtualKeyCode,
                                    p->Event.KeyEvent.wVirtualScanCode,
                                    p->Event.KeyEvent.dwControlKeyState);

                                if (VK_OEM_PERIOD == p->Event.KeyEvent.wVirtualKeyCode)
                                {
                                    return ;//if user type '.' return for demo
                                }
                            }
                        } while (p++, --n);
                    }
                    else
                    {
                        FlushConsoleInputBuffer(hStdIn);
                        break;
                    }

                } while (NumberOfEvents -= NumberOfEventsRead);
            }
            continue;

        case STATUS_USER_APC:
            DbgPrint("\nUSER_APC\n");
            return;
        case STATUS_ALERTED:
            DbgPrint("\nALERTED\n");
            return;
        case WAIT_FAILED :
            DbgPrint("\nWAIT_FAILED=%u\n", GetLastError());
            return;
        default:
            __debugbreak();
            return;
        }
    }
}

void SimpleDemo()
{
    if (HANDLE hCurrentThread = OpenThread(THREAD_ALERT|THREAD_SET_CONTEXT , FALSE, GetCurrentThreadId()))
    {
        ULONG dwThreadId;
        HANDLE hThread = CreateThread(0, 0, BreakWaitThread, hCurrentThread, 0, &dwThreadId);

        if (hThread)
        {
            ConsoleLoop(GetStdHandle(STD_INPUT_HANDLE));
            PostThreadMessage(dwThreadId, WM_QUIT, 0, 0);
            WaitForSingleObject(hThread, INFINITE);
            CloseHandle(hThread);
        }
        else
        {
            CloseHandle(hCurrentThread);
        }
    }
}

更新:这是JPA 2.1规范讲述覆盖映射超类中的列的原因:

  

11.1.4 AttributeOverride注释

     

@AttributeOverride注释用于覆盖映射   @Entity @Table(name = "CART2") @AttributeOverride(name = "cartName", column = @Column(name="CART_NAME")) public class CartEntity extends CartBaseEntity implements Serializable { ... } (无论是显式还是默认)属性或字段或AttributeOverride   财产或领域。

     

Basic注释可以应用于实体   将映射的超类或嵌入的字段或属性扩展为   覆盖映射定义的Id映射或AttributeOverride映射   超类或可嵌入类(或其中一个的可嵌入类)   属性)。

相关问题