休眠:在另一个实体PK中使用复合FK的一部分

时间:2018-08-01 23:25:44

标签: java mysql hibernate jpa

与Hibernate Mapping相对较新,我试图在Post和Comentario类之间实现这一功能而没有运气

Relational model

import os
import sys
import subprocess
import getopt
from humanize import naturalsize

def get_size(start_path='.'):
    # Might was to check validity of path here...
    #if not (os.path.exists(start_path) and os.path.isdir(start_path)):
    #    raise ValueError('Invalid path argument: {!r}'.format(start_path))
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(start_path):
        for f in filenames:
            fp = os.path.join(dirpath, f)
            total_size += os.path.getsize(fp)
    return total_size

def get_immediate_subdirectories(a_dir):
    return [name for name in os.listdir(a_dir)
            if os.path.isdir(os.path.join(a_dir, name))]

def version():
    print("Version: 1.0")

def usage():
    print("Usage: disk_usage.py [-a|--all][-n|--ncdu][-v|--version][directory name]")

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ad:hnv",
                            ["all", "directory=", "help", "ncdu", "version",])
    except getopt.GetoptError as err:
        print(err)
        usage()
        if __name__ == '__main__':
            return 2  # Unit test.
        else:
            sys.exit(2)

    for opt, arg in opts:
        if opt in ("-a", "--all"):
            for subdir in get_immediate_subdirectories('.'):
                print("%s\t\t %s" % (naturalsize(get_size(subdir)), subdir))
                sys.exit()
        elif opt in ("-d", "--directory"):
            print(naturalsize(get_size(start_path=arg)))
        elif opt in ("-v", "--version"):
            print(version())
            sys.exit()
        elif opt in ("-h", "--help"):
            usage()
            sys.exit()
        elif opt in ("-n", "--ncdu"):
            os.system('ncdu')
            sys.exit()
        else:
            print(usage())
    else:
        print(usage())


if __name__ == '__main__':
    # Unit test.
    sys.argv = ['disk_usage.py']  # no option given
    main()
    sys.argv = 'disk_usage.py -d.'.split()  # short opt
    main()
    sys.argv = 'disk_usage.py -dsome_folder'.split()  # short opt
    main()
    sys.argv = 'disk_usage.py -d some_folder'.split()  # short opt
    main()
    sys.argv = 'disk_usage.py --directory some_folder'.split()  # long opt
    main()
    sys.argv = 'disk_usage.py -d'.split()  # Missing argument error
    main()

没有映射comentario及其在Post中的字段工作正常,但是当我决定映射它时,出现此错误 在@MapsId映射中找不到列引用:idUsuario

是否没有在Comentario表中找到idUsuario列?我不想添加它,我可以在mysql中实现联接,但是我不知道如何在Hibernate中实现它

1 个答案:

答案 0 :(得分:0)

@MapsId批注用于将父实体的主键字段与子实体(具有相同名称)映射。 在您的情况下,您在父实体中具有复合主键,但是在子实体中,您只想引用它的一个字段。 PostPK有两个字段:idPostidUsuario。但是在Comentario类中,当您指定ManyToOne关系时,您提到的是@JoinColumn中的一列(即idPost),并且映射中没有idUsuario的字段。但是根据@MapsId注释的行为,idPost类中的两个字段(idUsuarioComentario)都是预期的。

因此,在您的情况下,@MapsId注释将无效