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
字段一、 我个人不喜欢这个主意。您不应该忘记,您希望编写同事甚至几个月后您自己都能理解的代码。即使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);