Java JPA:使用;“长食物”;而不是",;“福福”;尽可能使用@JoinColumn(对于JSON兼容)?

Java JPA:使用;“长食物”;而不是",;“福福”;尽可能使用@JoinColumn(对于JSON兼容)?,java,json,rest,jpa,Java,Json,Rest,Jpa,我有两张桌子: CREATE TABLE foo (id int, ...); CREATE TABLE bar (id int, foo_id int, FOREIGN KEY (foo_id) REFERENCES foo (id)); 为bar创建JPA模型类的典型方法是(缩短): 问题是,我想将这个模型类也用于JAX-RS,如果我通过REST服务接收到一个新的Bar类,它只包含一个foo\u id属性,该属性无法映射到foo类型的属性foo 我已经尝试了以下方法,即映射表列foo_id

我有两张桌子:

CREATE TABLE foo (id int, ...);
CREATE TABLE bar (id int, foo_id int, FOREIGN KEY (foo_id) REFERENCES foo (id));
bar
创建JPA模型类的典型方法是(缩短):

问题是,我想将这个模型类也用于JAX-RS,如果我通过REST服务接收到一个新的Bar类,它只包含一个
foo\u id
属性,该属性无法映射到
foo
类型的属性
foo

我已经尝试了以下方法,即映射表列
foo_id
两次,一次映射为数字id,一次映射为对象,但这也让JPA感到困惑:

...
@Column("foo_id")
long foo_id;

@ManyToOne
@JoinColumn("foo_id", insertable=false, updateable=false)
Foo foo;
这里的一般做法是什么?我是否应该在REST中使用foo_id,在Java中使用foo,并在REST边界类中在它们之间进行转换,即在持久化之前从数据库加载foo对象

我还想将这个模型类用于JAX-RS,如果我通过REST服务接收到一个新的Foo类,它只包含一个Foo_id属性,不能映射到Foo类型的属性Foo

这取决于您希望对对象执行的操作:

  • 如果只想在应用程序中使用
    Foo
    的实例而不与数据库同步,只需使用
    Foo\u id
    从数据库中获取
    Foo
    对象,如下所示:

    Foo foo = entityManager.find(Foo.class, foo_id`);
    
    并将此实例分配给
    Bar
    类的
    foo
    字段

  • 如果要将
    对象与数据库同步,请按如下方式合并:

    Bar bar = entityManager.merge(bar); 
    
    然后为
    Foo\u id
    获取
    Foo
    对象,如
    1.
    中所示,并将其分配给
    bar
    对象的
    Foo
    字段

  • 我已经尝试了以下方法,即将表列foo_id映射两次,一次映射为数字id,一次映射为对象,但这确实混淆了JPA


    一、 我个人不喜欢这个主意。您不应该忘记,您希望编写同事甚至几个月后您自己都能理解的代码。即使JPA允许你这么做,别人也很难理解你为什么这么做

    如果我通过REST服务接收到一个新的Foo类,它只包含一个Foo_id属性
    :你是指
    对象还是
    Foo
    ?您最好发布相关代码,以便我们了解您的问题所在。您是对的,我将其更改为
    Bar
    。原始类包含太多与我的雇主无关的代码和特定的类名。如果我的问题不清楚,我宁愿在github上写一个小演示,但我希望它是可以理解的。如果Bar模型类不包含“long fooId”属性,REST映射程序将在传入请求包含“foo_id”时抛出异常。我必须复制Bar类,一个版本用于REST/JSON,另一个版本稍有不同,作为JPA模型。尽管在REST服务中保持一个稳定的外部API可能是件好事,但我希望我可以避免重复。在一个简单的项目中,我不理解这个问题,因为你没有发布REST接口;至少界面中您面临问题的相关部分可能有助于查看是否有更好的解决方案。
    Bar bar = entityManager.merge(bar);